首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过Outlook和Redemption发送电子邮件时的AV

通过Outlook和Redemption发送电子邮件时的AV
EN

Stack Overflow用户
提问于 2011-04-25 22:24:31
回答 5查看 1.8K关注 0票数 1

下面是我的代码:

代码语言:javascript
复制
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服务器的一个这样的代码片段。

代码语言:javascript
复制
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的地址有什么神奇之处?它一定是解决方案的线索。

蒂娅

不,上午。

EN

回答 5

Stack Overflow用户

发布于 2011-04-25 22:38:16

尝试删除varclear语句。

您描述的症状表明您正在设法从例程中的内存中逐出COM对象,然后当方法变量超出作用域时,Delphi会再次尝试释放它们。

票数 0
EN

Stack Overflow用户

发布于 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代码崩溃。

我通常使用的模式是:

代码语言:javascript
复制
Create / CreateOleObject
try
  Connect
  try
    ...
  finally
    Disconnect
  end
finally
  Free / Release 
end

在使用Delphi提供的TxxxApplication包装器CreateOleObject和释放接口(设置为nil/unassigned)时,如果您使用的是“Create”COM,则可以使用Create和Free。

在您的示例中,这将意味着添加

代码语言:javascript
复制
olApp.Connect;

在CreateOleObject和olNameSpace赋值行之间,并添加

代码语言:javascript
复制
olApp.Disconnect;

在olNameSpace.LogOff之后;

添加几个try/finally块也不会浪费。

票数 0
EN

Stack Overflow用户

发布于 2011-04-26 03:17:31

我使用的是Redemption 5.0.0.2174,Delphi 7,Outlook 2003

我修改了你的代码如下,并能够发送一封电子邮件,没有任何错误

代码语言:javascript
复制
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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5779308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档