下面是我的代码:
const
olMailItem = 0;
var
olApp, OlNameSpace, OlItem, rdSafeItem, rdUtils: variant;
begin
olApp:= CreateOleObject ('Outlook.Application');
olNameSpace:= olApp.GetNamespace ('MAPI');
olNameSpace.Logon;
olItem:= olApp.CreateItem (olMailItem);
rdSafeItem:= CreateOleObject ('Redemption.SafeMailItem');
rdSafeItem.Item:= olItem;
rdSafeItem.Subject:= 'Testing';
rdSafeItem.attachments.Add ('c:\windows\win.ini');
rdSafeItem.Recipients.Add ('test@testing.com');
rdSafeItem.Send;
rdUtils:= CreateOleObject ('Redemption.MAPIUtils');
rdUtils.DeliverNow;
olNameSpace.Logoff;
varclear (rdUtils);
varclear (rdSafeItem);
varclear (olItem);
varclear (olNameSpace);
varclear (olApp);
end;电子邮件发送后,我在地址A70D6D13 (此地址似乎是恒定的)收到一条访问冲突消息。如果我使用F8单步执行整个过程,在'end‘语句之后,CPU窗口显示在地址A70D6D13处,并将所有内存显示为?
我使用的是Delphi 7,Outlook 2003,Redemption 4.8.0.1184这段代码缺少什么?
编辑:我发现了一些通过Outlook/Redemption发送邮件的代码片段。下面是使用OutlookApplication服务器的一个这样的代码片段。
begin
outlookapplication1.Connect;
NmSpace:= outlookapplication1.GetNamespace('MAPI');
NmSpace.Logon('', '', False, False);
oItem:= outlookapplication1.CreateItem(olMailItem);
sItem:= CreateOleObject('Redemption.SafeMailItem');
oItem.Subject:= 'my subject';
oItem.save;
sItem.Item:= oItem;
sItem.Recipients.Add('test@test.com');
sItem.Attachments.Add('C:\windows\win.ini');
sItem.save;
SItem.send;
outlookapplication1.Disconnect;
end;这也会产生相同的错误。AV的地址有什么神奇之处?它一定是解决方案的线索。
蒂娅
不,上午。
发布于 2011-04-25 22:38:16
尝试删除varclear语句。
您描述的症状表明您正在设法从例程中的内存中逐出COM对象,然后当方法变量超出作用域时,Delphi会再次尝试释放它们。
发布于 2011-04-26 01:15:54
更新
正如No‘’am正确评论的那样,Outlook的应用程序COM接口不支持连接和断开连接。我对此感到惊讶,但我通常使用Delphi包装器,实际上TOutlookApplication的连接实现只返回CreateOleObject或GetActiveObject的结果。TOutlookApplication的Disconnect方法的实现实际上不仅仅是释放接口。如果AutoQuit为真,则在应用程序的COM接口上调用Quit。
然而,由于它似乎是可选的,我认为不调用olApp.Quit应该不会导致No‘as遇到的问题。留下我的答案作为“教育”材料,这样其他人就不需要检查了。
我不确定这是否真的是您问题的原因,但我在您的代码中遗漏了与Outlook应用程序的连接和断开连接。尽管它们显然不是使用Outlook COM服务器所必需的(正如所发送的邮件所建议的那样),但它们是我所知道的“正常”COM使用模式的一部分。我可以很好地想象,如果不连接/断开连接,当vars超出作用域(在end语句之后)触发时,很可能会导致finalization代码崩溃。
我通常使用的模式是:
Create / CreateOleObject
try
Connect
try
...
finally
Disconnect
end
finally
Free / Release
end在使用Delphi提供的TxxxApplication包装器CreateOleObject和释放接口(设置为nil/unassigned)时,如果您使用的是“Create”COM,则可以使用Create和Free。
在您的示例中,这将意味着添加
olApp.Connect;在CreateOleObject和olNameSpace赋值行之间,并添加
olApp.Disconnect;在olNameSpace.LogOff之后;
添加几个try/finally块也不会浪费。
发布于 2011-04-26 03:17:31
我使用的是Redemption 5.0.0.2174,Delphi 7,Outlook 2003
我修改了你的代码如下,并能够发送一封电子邮件,没有任何错误
const
olMailItem = 0;
var
olApp, OlNameSpace, OlItem, rdSafeItem, rdUtils: variant;
begin
olApp:= CreateOleObject ('Outlook.Application');
olNameSpace:= olApp.GetNamespace ('MAPI');
olNameSpace.Logon;
olItem:= olApp.CreateItem (olMailItem);
rdSafeItem:= CreateOleObject ('Redemption.SafeMailItem');
rdSafeItem.Item:= olItem;
rdSafeItem.Subject:= 'Testing';
rdSafeItem.attachments.Add ('c:\windows\win.ini');
rdSafeItem.Recipients.Add ('test@testing.com');
rdSafeItem.Recipients.ResolveAll; // added
rdSafeItem.Send;
// rdUtils:= CreateOleObject ('Redemption.MAPIUtils');
// rdUtils.DeliverNow;
olNameSpace.Logoff;
// varclear (rdUtils);
// varclear (rdSafeItem);
// varclear (olItem);
// varclear (olNameSpace);
// varclear (olApp);
end;https://stackoverflow.com/questions/5779308
复制相似问题