Ошибка при динамической загрузке mapi32.dll

Наше приложение использует Simple MAPI для отправки электронной почты. У одного из наших клиентов возникли проблемы с отправкой электронной почты из сеанса на своем терминальном сервере.

Mapi32.dll загружается с вызовом LoadLibrary, который завершается успешно, но затем наше приложение пытается получить адреса функций MAPILogon, MAPILogOff, MAPISendMail, MAPIFreeBuffer и MAPIResolveName. Проблема в том, что GetProcAddress не работает для тех функций с ERROR_ACCESS_DENIED (код: 5), за исключением MAPIFreeBuffer. Похоже, это какая-то штука безопасности.

Как я могу это исправить или мне следует использовать другой метод для отправки почты?

FWI, вот дополнительная информация об ОС и содержимом раздела реестра HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows Messaging Subsystem:

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:

Я использую Delphi 7.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

Информация о версии файла C: \ Program Files \ Common Files \ SYSTEM \ MSMAPI \ 1043 \ msmapi32.dll

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

person The_Fox    schedule 07.05.2010    source источник


Ответы (2)


Я нашел проблему. Как вы можете видеть в моем вопросе, mapi32.dll предоставляется сервером Exchange. (Версия 6.5.7226 = Microsoft Exchange Server 2003 SP1). Согласно этот сайт Exchange 2003 не поддерживает Simple MAPI по соображениям безопасности:

Начиная с Exchange 2003, Exchange больше не реализует простой MAPI. API был удален, чтобы уменьшить потенциальную поверхность атаки

Вот почему я не могу получить ProcAddresses простых вызовов MAPI.

Похоже, мне нужно перейти на поддержку расширенного MAPI.

person The_Fox    schedule 01.06.2010

Думаю, это проблема смешанных версий mapi32.dll. Например, Office2003 и 2007 на одном компьютере или неудачная деинсталляция / повторная установка пересекающихся версий (т. Е. Попытка удалить 2007 и вернуться к 2003, или наоборот). Попросите клиента найти mapi32.dll на всем HD и посмотреть, есть ли несколько версий. Если есть только один, сравните версию с известной работающей системой.

См. Это: http://www.techtalkz.com/microsoft-outlook/391309-mapi32-dll-error-help-my-kids-xms-gift-broken.html

person Chris Thornton    schedule 07.05.2010
comment
Я добавил запрашиваемую информацию о версии. Сразу скажу, что версия mapi32.dll выглядит подозрительно. Разве это не должно быть заглушкой с версией 1, как в Windows XP? Может быть, мне нужно попросить моего клиента запустить fixmapi.exe. - person The_Fox; 27.05.2010