32-битное приложение MAPI с 64-битным Outlook

32-разрядная версия нашего приложения не может отправлять электронную почту, используя MAPISendMail с установленным 64-битным Outlook. Он возвращает ошибку 0x80004005, о которой я могу найти мало информации, кроме того факта, что это ошибка инициализации MAPI.

Согласно этому документу MSDN, MAPISendMail это единственное исключение из правила, согласно которому 32-битные приложения не могут использовать 64-битный MAPI. И все же это не работает (по крайней мере, с XP и Vista- мы еще не тестировали Win7/8).

Кто-нибудь может пролить свет на это?

ТИА

2 ответа

Решение

Нет никаких исключений: 32-битный процесс не может загрузить 64-битную DLL. Если у вас есть 64-разрядная версия Outlook, 64-разрядная версия mapi32.dll содержит фактическую реализацию. 32-битная версия mapi32.dll является заглушкой, которая ничего не делает, но возвращает ошибку.

Это не совсем верно @DmitryStreblechenko, - по крайней мере, не для MAPISendMail функция. Для этого и только для этого можно построить "Мост Outlook64". Это будет затем перенаправить 32-битный MAPISendMail звонки на 64 битный Outlook. Этот мост может выглядеть так:

[HKEY_LOCAL_MACHINE\SOFTWARE\Clients\Mail\Outlook64Bridge]
@="Outlook64Bridge"
"DLLPathEx"="c:\\Windows\\winsxs\\x86_microsof t-windows-mapi_31bf3856ad364e35_6.1.7600.16385_none_ab239772 7b134496\\MAPI32.DLL"
"DLLPath"="c:\\Windows\\winsxs\\x86_microsoft-windows-mapi_31bf3856ad364e35_6.1.7600.16385_none_ab239772 7b134496\\MAPI32.DLL"

ВАЖНО, - вы должны сначала проверить правильность пути вашего 32-битного mapi32.dll!

После добавления этих строк в регистр вы должны установить Outlook64Bridge в качестве почтового клиента по умолчанию:

[HKEY_LOCAL_MACHINE\SOFTWARE\Clients\Mail]
@="Outlook64Bridge" 

Подтверждено, что он работает для простых 32- битных приложений, которые действительно используют только функцию MAPISendMail.

Более подробную информацию можно найти здесь

Несколько лет назад у меня была такая же проблема. Я пробовал и пробовал снова, но никак... Microsoft заблокировала некоторые взаимодействия между 32-битным и 64-битным приложением: вы даже не можете использовать 64-битный OCX/OLE в 32-битном приложении.

Решение Outlook Bridge, описанное выше (@VMAtm), сначала работало, затем Microsoft исправила его, и оно перестало работать.

В конце концов, я реализовал 64-битное приложение, мое приложение-мост, для подключения основного 32-битного приложения с 64-битным внешним видом:

  1. Основное 32-битное приложение запущено...
  2. Основной 32-битный мост вызовов 64-битное приложение; почтовые данные (от кого, кому, заголовок, тело...) хранятся в xml-файле. Файл xml передается через командную строку.
  3. 64 запускается приложение моста и вызывает функции MAPI.
  4. Остальное сделает 64-битный Outlook.

Эти решения работают нормально, и я совершенно уверен, что мне не нужно бороться с библиотеками MAPI.

Другие вопросы по тегам