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-битным внешним видом:
- Основное 32-битное приложение запущено...
- Основной 32-битный мост вызовов 64-битное приложение; почтовые данные (от кого, кому, заголовок, тело...) хранятся в xml-файле. Файл xml передается через командную строку.
- 64 запускается приложение моста и вызывает функции MAPI.
- Остальное сделает 64-битный Outlook.
Эти решения работают нормально, и я совершенно уверен, что мне не нужно бороться с библиотеками MAPI.