Delphi 动态加载mapi32.dll时出错

Delphi 动态加载mapi32.dll时出错,delphi,api,dll,mapi,access-denied,Delphi,Api,Dll,Mapi,Access Denied,我们的应用程序使用简单的MAPI发送电子邮件。我们的一个客户端在从其终端服务器上的会话发送电子邮件时遇到问题 mapi32.dll加载时调用LoadLibrary,调用成功,但应用程序尝试获取函数MAPILogon、MAPILogOff、MAPISendMail、MAPIFreeBuffer和MAPIResolveName的地址。问题是GetProcAddress对于那些带有错误\u访问\u被拒绝(代码:5)的函数失败,除了MAPIFreeBuffer。看起来像是某种安全措施 我如何解决这个问题

我们的应用程序使用简单的MAPI发送电子邮件。我们的一个客户端在从其终端服务器上的会话发送电子邮件时遇到问题

mapi32.dll加载时调用LoadLibrary,调用成功,但应用程序尝试获取函数
MAPILogon
MAPILogOff
MAPISendMail
MAPIFreeBuffer
MAPIResolveName
的地址。问题是
GetProcAddress
对于那些带有
错误\u访问\u被拒绝
(代码:5)的函数失败,除了
MAPIFreeBuffer
。看起来像是某种安全措施

我如何解决这个问题,或者应该使用其他方法发送邮件

FWI,以下是有关操作系统和注册表项HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows消息子系统内容的更多信息:

OS info: 5.2.3790 VER_PLATFORM_WIN32_NT Service Pack 2

Contents of SOFTWARE\Microsoft\Windows Messaging Subsystem
InstallCmd: rundll32 setupapi,InstallHinfSection MSMAIL 132 msmail.inf
MAPI: 1
CMCDLLNAME: mapi.dll
CMCDLLNAME32: mapi32.dll
CMC: 1
MAPIX: 1
MAPIXVER: 1.0.0.1
OLEMessaging: 1
Contents of SOFTWARE\Microsoft\Windows Messaging Subsystem\MSMapiApps
inetsw95.exe: 
choosusr.dll: 
msab32.dll:
nwab32.dll:
outstore.dll: Microsoft Outlook
CDOEXM.DLL:
EMSMDB32.DLL:
EMSABP32.DLL:
newprof.exe: Microsoft Outlook
outlook.exe: 
wfxmsrvr.exe: Microsoft Outlook
msexcimc.exe:
exchng32.exe:
schdmapi.dll: Microsoft Outlook
pilotcfg.exe: Microsoft Outlook
mailmig.exe: Microsoft Outlook
admin.exe:
msspc32.dll: Microsoft Outlook
cnfnot32.exe: Microsoft Outlook
ilpilot.exe: Microsoft Outlook
events.exe:
我使用Delphi7.0,但这不重要

编辑、添加版本信息:

C:\WINDOWS\system32\mapi32.dll的文件版本信息

Fileversion: 6.5.7226.0
FileDescription=Extended MAPI 1.0 for Windows NT
CompanyName=Microsoft Corporation
InternalName=MAPI32
Comments=Service Pack 1
LegalCopyRight=Copyright (C) 1986-2003 Microsoft Corp. All rights reserved.
LegalTradeMarks=Microsoft(R) and Windows(R) are registered trademarks of Microsoft Corporation.
OriginalFileName=MAPI32.DLL
ProductName=Microsoft Exchange
ProductVersion=6.5
Fileversion: 11.0.5601.0
FileDescription=Extended MAPI 1.0 for Windows NT
CompanyName=Microsoft Corporation
InternalName=MAPI32.DLL
LegalCopyRight=Copyright © 1995-2003 Microsoft Corporation. All rights reserved.
OriginalFileName=MAPI32.DLL
ProductName=MAPI32
ProductVersion=11.0.5601
C:\Program Files\Common Files\SYSTEM\MSMAPI\1043\msmapi32.dll的文件版本信息

Fileversion: 6.5.7226.0
FileDescription=Extended MAPI 1.0 for Windows NT
CompanyName=Microsoft Corporation
InternalName=MAPI32
Comments=Service Pack 1
LegalCopyRight=Copyright (C) 1986-2003 Microsoft Corp. All rights reserved.
LegalTradeMarks=Microsoft(R) and Windows(R) are registered trademarks of Microsoft Corporation.
OriginalFileName=MAPI32.DLL
ProductName=Microsoft Exchange
ProductVersion=6.5
Fileversion: 11.0.5601.0
FileDescription=Extended MAPI 1.0 for Windows NT
CompanyName=Microsoft Corporation
InternalName=MAPI32.DLL
LegalCopyRight=Copyright © 1995-2003 Microsoft Corporation. All rights reserved.
OriginalFileName=MAPI32.DLL
ProductName=MAPI32
ProductVersion=11.0.5601

我认为这是mapi32.dll混合版本的问题。例如,可能是同一台计算机上的Office2003和2007,或者是跨版本的错误卸载/重新安装(即,尝试卸载2007并返回到2003,反之亦然)。让客户端在整个HD中搜索mapi32.dll,查看是否有多个版本。如果只有一个,请将该版本与已知的工作系统进行比较

见此:

我认为这是mapi32.dll混合版本的问题。例如,可能是同一台计算机上的Office2003和2007,或者是跨版本的错误卸载/重新安装(即,尝试卸载2007并返回到2003,反之亦然)。让客户端在整个HD中搜索mapi32.dll,查看是否有多个版本。如果只有一个,请将该版本与已知的工作系统进行比较

见此:
我发现了这个问题。正如您在我的问题中所看到的,mapi32.dll是由Exchange server提供的。(). 根据 出于安全原因,Exchange 2003不支持简单MAPI:

从Exchange2003起,Exchange不再实现简单MAPI。移除API以减少潜在的攻击面

因此,这就是我无法获取简单MAPI调用的ProcAddresses的原因


看来我必须去支持扩展MAPI了。

我发现了问题。正如您在我的问题中所看到的,mapi32.dll是由Exchange server提供的。(). 根据 出于安全原因,Exchange 2003不支持简单MAPI:

从Exchange2003起,Exchange不再实现简单MAPI。移除API以减少潜在的攻击面

因此,这就是我无法获取简单MAPI调用的ProcAddresses的原因


看来我必须支持扩展MAPI。

我添加了请求的版本信息。我不得不说,mapi32.dll的版本看起来可疑。这不应该是版本1的存根吗,就像在Windows XP上一样?也许我必须让我的客户端运行fixmapi.exe。我添加了请求的版本信息。我不得不说,mapi32.dll的版本看起来可疑。这不应该是版本1的存根吗,就像在Windows XP上一样?也许我必须让我的客户运行fixmapi.exe。