Как создать заглушку MAPI32.dll для отправки в виде вложения из MS Word?

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

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

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

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

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


person goorj    schedule 22.09.2009    source источник
comment
Этот вопрос следует задать на superuser.com.   -  person Fredrik Mörk    schedule 22.09.2009
comment
Word использует приложение электронной почты по умолчанию в вашей системе. Вам придется это изменить. Однако вопросы об общем использовании программного обеспечения следует задавать на superuser.com.   -  person Dirk Vollmar    schedule 22.09.2009
comment
Извините, я плохо сформулировал вопрос. Я ищу не замену почтового приложения по умолчанию, а информацию о том, как создать приложение, совместимое с mapi, чтобы позже мой почтовый агент мог заменить, например, Outlook.   -  person goorj    schedule 22.09.2009


Ответы (2)


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

Я сделал именно это совсем недавно: написал свою собственную скелетную dll mapi, и у меня было много проблем с получением системной заглушки для вызова моих расширенных функций mapi. Ключевым моментом было то, что mapi32.dll вызывает GetProcAddress в точке входа «foo @ x», а не в точке входа «foo» в интерфейсе mapi, чтобы проверить, «совместима» ли ваша dll с расширенным mapi (я думаю, для простого mapi называет, что он использует не «foo @ x», а простое имя точки входа «foo»). Мне также пришлось скомпилировать файл интерфейса моей скелетной библиотеки в моем проекте «As C», а не «As 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)

person Bogatyr    schedule 20.04.2010

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

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

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

person goorj    schedule 27.09.2009
comment
Не хотите поделиться, где вы нашли примеры Delphi? Я искал несколько дней. :) - person Joshua; 29.04.2012
comment
Прошло много времени, и я уже не могу вспомнить, извините! Я заметил, что в сети довольно много примеров с участием Delphi, но я не уверен, какие из них, если таковые имеются, я смотрел. Я помню, как выполнял поиск кода, попробуйте поискать код delphi с ключевыми словами MAPI! - person goorj; 04.05.2012