Как создать MAPI32.dll заглушку, чтобы иметь возможность “отправлять как вложение” из MS Word?

StackOverflow https://stackoverflow.com/questions/1458690

Вопрос

Microsoft Word имеет функцию "отправить как вложение", которая создает новое сообщение в Outlook с прикрепленным документом.

Я хотел бы заменить Outlook пользовательским почтовым агентом, но я не знаю, как этого добиться.Теперь мой почтовый агент - это просто программа, которая запускается и принимает имя файла в качестве параметра.

Насколько я знаю, "отправить как вложение" использует некоторую DLL / API под названием MAPI.Мне нужно было бы изменить свое приложение так, чтобы оно не просто принимало аргументы имени файла, но могло получать вызовы MAPI (?), которые MS Word использует при "отправке как вложение".

Кроме того, мне нужно изменить почтовый агент по умолчанию, создав свой собственный MAPI32.dll заглушка, которая просто перенаправляет на мое приложение.

Я был бы признателен, если бы у кого-нибудь было больше информации о том, как этого можно достичь!

Это было полезно?

Решение

При написании собственной реализации mapi крайне важно создать dll как с надлежащим экспортом, так и с соглашениями о вызовах, чтобы системная заглушка mapi dll (c:\windows\system32\mapi32.dll должна быть такой же, как mapistub.dll ) для передачи вызовов через вашу библиотеку dll.Функции MAPI вызываются в соответствии с соглашением о вызове __stdcall.Также важно установить правильные разделы реестра, чтобы ваша mapi dll была выбрана системной заглушкой, похоже, вы уже нашли правильный, чтобы указать конкретную mapi dll, которая будет использоваться, когда ваше приложение выполняет вызовы mapi.

Я сделал именно это совсем недавно:написал свою собственную скелетную библиотеку dll mapi, и у меня было много проблем с получением заглушки системы для вызова моих расширенных функций 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)

Другие советы

Хорошо, чтобы ответить на мой собственный вопрос.Мне нужно создать DLL с определенными функциями "MAPISendDocuments" и / или "MAPISendMail".

Эта библиотека DLL может иметь любое имя, и на нее есть ссылка в реестре по адресу HKLM/Software/Clients/Mail/MyMailApp/DLLPath.

Нашел примеры с использованием Delphi...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top