Как создать заглушку MAPI32.dll, чтобы иметь возможность «отправлять в виде вложений» из MS Word? - PullRequest
1 голос
/ 22 сентября 2009

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 20 апреля 2010

При написании собственной реализации 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)

0 голосов
/ 27 сентября 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...