如何声明我的简单MAPI提供程序DLL是Unicode并支持MapiSendMailW?

时间:2017-02-07 20:41:56

标签: unicode mapi

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

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

我已在注册表HKLM\SOFTWARE\Clients\Mail\中注册了我的DLL,可以通过“默认程序”选择它。

它完美运行(但仅限ANSI字符)!

现在,我正在尝试为其添加Unicode支持。

我已经实现了MapiSendMailW并将其声明为DLL的“export”部分,因此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。我在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\REGISTRY\MACHINE\Software\Clients\Mail\Microsoft Outlook

下找到了此注册表值“SupportUTF8”

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

所以,HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun.....下的“SupportUTF8”似乎有道理。

我的客户已在HKEY_LOCAL_MACHINE\SOFTWARE\Clients\Mail\.....

下注册

将SupportUTF8添加到我的客户端没有任何意义(仍然是问号,并且没有MapiSendMailW从MSIE调用MapiSendMail(文件|发送|链接通过电子邮件)。即使将SupportUTF8添加到HKEY_LOCAL_MACHINE\SOFTWARE\Clients\Mail\Microsoft Outlook也没有使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。

1 个答案:

答案 0 :(得分:0)

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

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