如何声明我的SimpleMAPI提供程序DLL是Unicode并支持MapiSendMailW



我编写了一个简单的MAPI提供程序DLL,它实现了以下功能:

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

我已经在注册表CCD_ 1中注册了我的DLL;默认程序";。

它工作得很好(但只使用ANSI字符)!

现在,我正在尝试添加对它的Unicode支持

我已经实现了MapiSendMailW;"出口";部分,以便MAPI DLL存根可以看到它导出MapiSendMailW,因此是Unicode。

然而,我的DLL的这个Unicode MapiSendMailW函数从未被调用过。而是调用ANSI版本MapiSendMail。

当我使用调用MAPI的应用程序时,例如Microsoft Internet Explorer(通过电子邮件发送链接)或Adobe Reader(通过邮件发送文件),MapiSendMail中的DLL中的国家字符会被问号取代。如果我将默认邮件客户端切换到Outlook,Microsoft Internet Explorer将正确发送国家字符。

与此同时,Outlook将其MAPI DLL宣传为Unicode。我已经找到了这个注册表值";SupportUTF8";HKEY_LOCAL_MACHINESOFTWAREMicrosoftOfficeClickToRunREGISTRYMACHINESoftwareClientsMailMicrosoft Outlook

当我删除此注册表项时,当我通过电子邮件选择"文件"/"发送"/"链接"时,Microsoft Internet Explorer在调用Outlook时也开始将国家字符替换为问号。

因此,似乎";SupportUTF8";CCD_ 3下有意义。

我的客户在HKEY_LOCAL_MACHINESOFTWAREClientsMail.....下注册

向我的客户端添加SupportUTF8毫无意义(仍然是问号,也没有调用MapiSendMailW,而是调用了MSIE中的MapiSendMail(文件|发送|通过电子邮件链接)。即使在HKEY_LOCAL_MACHINESOFTWAREClientsMailMicrosoft Outlook中添加SupportUTF8,MSIE在调用Outlook时也不会将国家字符替换为问号。

不管SupportUTF8注册表值如何,当我的客户端从MS Word调用时,它会得到MapiSendMail,但在ulReserved中,它会获得UTF8代码页编号,因此我的客户端能够显示国家字符。但这并没有发生在MSIE(文件|发送|通过电子邮件链接)中,它总是将国家字符替换为我的客户的问号。

我应该向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应用程序使用MapiSendMailW调用我的DLL。

我找到了这个问题的解决方案。我的Simple MAPI提供程序正常,并且已正确声明MapiSendMailW。一个简单的应用程序,只要使用LoadLibrary从Windows系统文件夹(C:\Windows\System32\mapi32.DLL)加载MAPI DLL,然后调用MapiSendMailW,就可以正常工作。我刚刚在测试Microsoft Internet Explorer和Adobe Reader时得出结论,"我的DLL的Unicode MapiSendMailW函数从未被调用"。但我后来发现,当涉及到Unicode时,这些应用程序无法正常使用MAPI,问题出在这些应用程序上。你不需要做任何事情。其他程序可以与我的DLL的Unicode MapiSendMailW函数一起正常工作。

除此之外,我还编译并注册了64位版本的MAPI DLL处理程序。只需注意结构大小——64位Windows与32位Windows有不同的对齐规则。所有字段必须按8个字节对齐。指针必须是64位,而整数(ULONG)必须是32位。TMapiMessageW结构在64位下的大小为96字节,而在Win32下的大小则为48字节。

相关内容

  • 没有找到相关文章

最新更新