2017-02-07 3 views
8

Я написал простой MAPI DLL провайдера, который реализует следующие функции:Как объявить, что моя простая DLL-провайдер MAPI является Unicode и поддерживает MapiSendMailW?

MapiLogOn   
MapiLogOff  
MapiSendMail  
MapiSendDocuments 
MapiFindNext  
MapiReadMail  
MapiSaveMail  
MapiDeleteMail 
MapiFreeBuffer 
MapiAddress  
MapiDetails  
MapiResolveName 

Я зарегистрировал свой DLL в реестре HKLM\SOFTWARE\Clients\Mail\ и может выбрать его с помощью «программы по умолчанию».

Он отлично работает (только с символами ANSI)!

Теперь я пытаюсь добавить поддержку Unicode.

Я реализовал MapiSendMailW и объявил его в разделе «экспорт» DLL, так что заглушка MAPI DLL могла видеть, что она экспортирует MapiSendMailW и, таким образом, является Unicode.

Однако эта функция Unicode MapiSendMailW моей DLL никогда не вызывается. Вместо этого вызывается версия ANSI, MapiSendMail.

Когда я использую приложения, которые вызывают MAPI, например. Microsoft Internet Explorer (для отправки ссылок по электронной почте) или Adobe Reader (для отправки файлов по электронной почте) национальные символы приходят в мою DLL в MapiSendMail, заменяемые вопросительными знаками. Если я переключу почтовый клиент по умолчанию в Outlook, Microsoft Internet Explorer правильно отправит национальные символы.

В то же время Outlook рекламирует свою MAPI DLL как Unicode. Я нашел это значение реестра «SupportUTF8» под HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\REGISTRY\MACHINE\Software\Clients\Mail\Microsoft Outlook

Когда я удалил этот раздел реестра, Microsoft Internet Explorer также начал заменять национальные символы на вопросительные знаки при вызове Outlook, когда я выбрал File/Send/Link по электронной почте.

Итак, кажется, что «SupportUTF8» под HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun..... имел смысл.

Мой клиент зарегистрирован под HKEY_LOCAL_MACHINE\SOFTWARE\Clients\Mail\.....

Добавление SupportUTF8 к моему клиенту никакого смысла (до сих пор не знаки вопроса, и ни MapiSendMailW не называется, но MAPISendMail из MSIE (File | Отправить | Ссылка по электронной почте) Даже добавление SupportUTF8 к HKEY_LOCAL_MACHINE\SOFTWARE\Clients\Mail\Microsoft Outlook. не заставил MSIE не заменять национальные символы на вопросительные знаки, когда звонки Outlook

Независимо от значения реестра SupportUTF8, когда мой клиент вызывается из MS Word, он получает MapiSendMail, но в ulReserved он получает номер кодовой страницы UTF8, поэтому мой клиент может отображать национальные символы, но это не происходит из MSIE (File | Send | Link by email), которые всегда заменяют чтобы указать знаки с моим клиентом.

Что я должен добавить в свою DLL, чтобы Windows Stub рассматривал его как Unicode и вызывал MapiSendMailW? Должен ли я регистрировать реализацию других функций в DLL, чтобы показать Stub, что это Unicode?

Я сделал два теста:

1) В Windows 10 64-битным. MAPI DLL 32-разрядная. Монитор процессов (из Sysinternals) показывает, что MSIE запускает процесс fixmapi.exe, который, в свою очередь, вызывает вызовы MAPI.

2) В Windows 7 32-бит. Нет fixmapi.exe: MSIE вызывает мою DLL напрямую, но по-прежнему не вызывает MapiSendMailW.

Однако мое тестовое приложение MAPI вызывает мою DLL с MapiSendMailW.

+0

Бррр, вспахающий через хиты ИТ-персонала, мало радости. Я думаю, что вы ищете [это свойство] (https://msdn.microsoft.com/en-us/library/cc815684.aspx), не уверен. –

+0

PR_STORE_UNICODE_MASK из расширенного MAPI, в то время как я реализовал Simple MAPI, чтобы просто отправлять сообщения без каких-либо магазинов. –

ответ

0

Я нашел решение этой проблемы. Мой простой провайдер MAPI был в порядке, и он правильно заявил MapiSendMailW. Простое приложение, которое просто использует LoadLibrary для загрузки MAPI DLL из системной папки Windows (C: \ Windows \ System32 \ mapi32.dll), а затем вызывает MapiSendMailW, будет работать правильно. Я просто тестировал Microsoft Internet Explorer и Adobe Reader, когда пришел к выводу, что функция Unicode MapiSendMailW моей DLL никогда не называется ». Но позже я узнал, что эти приложения не работают должным образом с MAPI, когда дело доходит до Unicode, проблема была в этих приложениях. Тебе не нужно ничего делать. Другие программы работают правильно с помощью функции Unicode MapiSendMailW моей DLL.

Кроме того, мне также удалось скомпилировать и зарегистрировать 64-разрядную версию обработчика DLL MAPI. Уход нужно только с размерами структуры - 64-битные Windows имеют разные правила выравнивания, а затем 32-разрядные. Все поля должны быть выровнены по 8 байт. Указатели должны быть 64-битными, а целые числа (ULONG) должны быть 32-битными. Размер структуры TMapiMessageW под 64-битным значением составляет 96 байт, а под Win32 - 48 байт.

Смежные вопросы