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

Max*_*tin 8 unicode mapi

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

MapiLogOn        
MapiLogOff       
MapiSendMail     
MapiSendDocuments
MapiFindNext     
MapiReadMail     
MapiSaveMail     
MapiDeleteMail   
MapiFreeBuffer   
MapiAddress      
MapiDetails      
MapiResolveName  
Run Code Online (Sandbox Code Playgroud)

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

它完美地工作(但仅限ANSI字符)!

现在,我正在尝试为它添加Unicode支持.

我已经实现了MapiSendMailW并将其声明为DLL的"导出"部分,因此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_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\REGISTRY\MACHINE\Software\Clients\Mail\Microsoft Outlook

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

所以,似乎"SupportUTF8"下 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun.....有意义.

我的客户是在 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.

Max*_*tin 1

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

\n\n

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

\n