При написании собственной реализации mapi очень важно создать dll с соответствующими соглашениями об экспорте и вызовах, чтобы системная заглушка mapi dll (c: \ windows \ system32 \ mapi32.dll, должна совпадать с mapistub .dll) для пропуска звонков на вашу dll. Функции MAPI вызываются в соответствии с соглашением о вызовах __stdcall. Также важно установить правильные ключи реестра для того, чтобы системный заглушку выбирал mapi dll, похоже, что вы уже нашли правильный, чтобы указать конкретный mapill, который будет использоваться, когда ваше приложение выполняет вызовы mapi.
Я сделал именно это совсем недавно: написал свой собственный скелет mapi dll, и у меня было много проблем с тем, чтобы заставить системную заглушку вызывать мои расширенные функции mapi. Ключевым моментом было то, что mapi32.dll вызывает GetProcAddress для точки входа "foo @ x", а не для точки входа "foo" в интерфейсе mapi, чтобы проверить, является ли ваша dll "совместимой" с расширенными mapi (я думаю, для простого mapi вызывает это не "foo @ x", а просто имя точки входа "foo"). Мне также пришлось скомпилировать файл интерфейса моей библиотеки скелетов в моем проекте «Как C», а не «Как C ++», чтобы все имена символов были правильными.
Например, MAPIInitialize должен быть объявлен так в вашем исходном коде:
HRESULT __stdcall MAPIInitialize( LPVOID lpMapiInit )
...
и вам нужно указать файл .def с такими записями:
EXPORTS
MAPIInitialize@4=_MAPIInitialize@4
MAPIInitialize=_MAPIInitialize@4
Для простых вызовов mapi (в отличие от расширенных вызовов mapi) вам может не потребоваться «двойной экспорт». Чтобы увидеть, как выглядит экспорт для работающей реализации mapi, вы можете сделать это (если у вас установлен outlook в вашей системе):
c:\> dumpbin /exports c:\Program Files\Common Files\SYSTEM\MSMAPI\1033\msmapi32.dll
(или подставьте путь, указанный в реестре в HKLM\Software\Clients\Mail\Microsoft Outlook\DLLPathEx
)