0

“我正在使用 Delphi 7 程序中的 Simple MAPI 发送电子邮件。多年来一直运行良好。过去两周左右,我们的两个客户收到错误“外部异常 241938E”。我试图找到这段代码在互联网上,但没有提及。有人知道这个错误吗?两个客户都在终端服务器上运行,使用 Outlook 作为 Office 365 服务器上的邮件客户端“

上面的消息是由另一位发帖者发布的,但我觉得过早地被关闭了。我有确切的情况。两个完全不相关的客户使用不相关的软件包(一个是大约十年前在 D7 中开发的,一个是大约 3 年前在 XE3 中开发的)。只是认为它们的共同点是它们都使用 MAPI 来发送电子邮件,并且它们都在终端服务器环境下运行。两个客户都独立安装了我们的程序。IE。他们拥有直接在自己的桌面上运行的应用程序副本。因此,它不是可能由多个用户同时使用的程序的共享实例。我对 Microsoft Office 及其安装知之甚少。我认为它的使用是共享的。

我已经嵌入了 EurekaLog,但这一切都无济于事。通过我自己的内部日志记录,我已经能够确定出现错误的确切点。它在调用中加载 MAPI DLL 库。确切的代码行在下面,其中 MAPIModule 是一个 HModule,MAPIDLL 是直接来自 MAPI APi 的值 - 即“MAPI32.DLL”。

MAPIModule    := LoadLibrary(PChar(MAPIDLL));

我坚持的一件事是它不是恒定的。根据我自己的测试,我能够在间隔超过一个小时的测试的 13 次尝试中发送 2 封电子邮件。没有任何理由或理由说明为什么它在这两种情况下都有效。但有 11 次尝试在同一地点失败。

[ 更多细节 ]

执行以下代码以触发 SendMail。

MapiModule 是 LoadLibrary 调用返回的句柄。返回的值被传递给 GetProcAddress。GetProcAddress 失败,并引发 EXTERNAL EXCEPTION 错误。

不幸的是,我对 EurekaLog 没有深入的了解,但据我所知,我已经启用了所有有效的选项。但从未创建过错误日志文件。

尽管错误处理例程捕获了错误并返回值 99(我用它来表示未定义的错误),但前端应用程序变得不可用。它没有冻结,没有崩溃。计时器正在运行,屏幕刷新继续。但它被锁定并且无法接受用户输入 - 好像控制权已传递给 Outlook 以处理电子邮件的发送但未返回。

现在包括 SM 声明。它指向在 MAPI API 中声明的函数。

TFNMapiSendMail = function(lhSession: LHANDLE; ulUIParam: ULONG_PTR;
                           var lpMessage: TMapiMessage; flFlags: FLAGS;
                           ulReserved: ULONG): ULONG stdcall;

var SM : TFNMapiSendMail;

MAPIModule    := LoadLibrary(PChar(MAPIDLL));

if MAPIModule = 0 then
begin
  Result := 'MAPI Library not found';
end
else
begin
  try
    @SM := GetProcAddress(MAPIModule, 'MAPISendMail');

    if @SM <> nil then
    begin
      try
        MAPIError := SM(0, Application.Handle, MapiMessage, MAPI_DIALOG or 
                        MAPI_LOGON_UI, 0);
      except
        MAPIError := 99;
      end;
    end
    else
    begin
      MAPIError := 1;
    end;
  finally
    FreeLibrary(MAPIModule);
  end;
end;
4

0 回答 0