动态加载mapi32.dll时出错

时间:2010-05-07 11:20:26

标签: delphi api dll mapi access-denied

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

mapi32.dll加载了对LoadLibrary的调用,但是我们的应用程序尝试获取函数地址MAPILogonMAPILogOffMAPISendMail,{{1 }和MAPIFreeBuffer。问题是除了MAPIResolveName之外,GetProcAddressERROR_ACCESS_DENIED(代码:5)的函数失败。它看起来像某种安全问题。

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

FWI,这里有一些关于操作系统和注册表项HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows Messaging Subsystem的内容的更多信息:

MAPIFreeBuffer

我在使用Delphi 7.0,但这不重要。

编辑,添加版本信息:

C:\ WINDOWS \ system32 \ mapi32.dll的文件转换信息

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:

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

2 个答案:

答案 0 :(得分:1)

我发现了问题。正如您在我的问题中所看到的,mapi32.dll由Exchange服务器提供。 (Version 6.5.7226 = Microsoft Exchange Server 2003 SP1)。根据{{​​3}} 出于安全原因,Exchange 2003不支持简单MAPI:

  

从Exchange 2003开始,Exchange不再实现简单MAPI。删除API以减少潜在的攻击面

这就是我无法获得简单MAPI调用的ProcAddresses的原因。

看起来我必须支持扩展MAPI。

答案 1 :(得分:0)

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

看到这个: http://www.techtalkz.com/microsoft-outlook/391309-mapi32-dll-error-help-my-kids-xms-gift-broken.html