Я написал простой 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.
Бррр, вспахающий через хиты ИТ-персонала, мало радости. Я думаю, что вы ищете [это свойство] (https://msdn.microsoft.com/en-us/library/cc815684.aspx), не уверен. –
PR_STORE_UNICODE_MASK из расширенного MAPI, в то время как я реализовал Simple MAPI, чтобы просто отправлять сообщения без каких-либо магазинов. –