如何创建MAPI32.dll存根以便能够从MS Word“作为附件发送”?

时间:2009-09-22 07:53:04

标签: c# python outlook ms-word mapi

Microsoft Word具有“作为附件发送”功能,可在Outlook中附加文档创建新邮件。

我想用自定义邮件代理替换Outlook,但我不知道如何实现这一点。现在我的邮件代理只是一个运行的程序,并将文件名作为参数。

据我所知,“作为附件发送”正在使用一些名为MAPI的DLL / API。我需要更改我的应用程序,以便它不仅仅接受文件名参数,但可以接收MS Word在“作为附件发送”时使用的MAPI(?)调用。

此外,我需要通过创建自己的MAPI32.dll存根来更改默认邮件代理,该存根只是重定向到我的应用程序。

如果有人了解如何实现这一目标,我将不胜感激!

2 个答案:

答案 0 :(得分:1)

编写自己的mapi实现时,为了系统存根mapi dll(c:\ windows \ system32 \ mapi32.dll,应该与mapistub相同)创建一个具有正确导出和调用约定的dll至关重要。 .dll)将调用传递给你的dll。使用__stdcall调用约定调用MAPI函数。同样重要的是设置正确的注册表键,以便您可以通过系统存根选择mapi dll,看起来您已经找到了正确的注册表键,以便指定当您的应用程序进行mapi调用时使用的特定mapi dll。

我最近做了这件事:编写了我自己的骨架mapi dll,并且在系统存根调用扩展的mapi函数时遇到了很多麻烦。关键是mapi32.dll在“foo @ x”入口点调用GetProcAddress,而不是mapi界面中的“foo”入口点,以便测试你的dll是否与扩展mapi“兼容”(我想简单mapi调用它不使用“foo @ x”而是使用普通的“foo”入口点名称)。我还必须在我的项目“As C”而不是“As C ++”中编译我的骨架库接口文件,以便获得所有符号名称。

例如,MAPIInitialize应该在源代码中声明如下:

HRESULT __stdcall MAPIInitialize( LPVOID lpMapiInit )
...

并且您需要指定一个包含以下条目的.def文件:

EXPORTS
    MAPIInitialize@4=_MAPIInitialize@4
    MAPIInitialize=_MAPIInitialize@4

对于简单的mapi调用(与扩展的mapi调用相反),您可能不需要“双重导出”。为了查看工作mapi实现的导出情况,您可以执行此操作(如果您在系统上安装了Outlook):

c:\> dumpbin /exports c:\Program Files\Common Files\SYSTEM\MSMAPI\1033\msmapi32.dll

(或替换您在HKLM\Software\Clients\Mail\Microsoft Outlook\DLLPathEx中的注册表中找到的路径

答案 1 :(得分:0)

好的,回答我自己的问题。我需要构建一个定义了“MAPISendDocuments”和/或“MAPISendMail”函数的DLL。

此DLL可以具有任何名称,并在HKLM / Software / Clients / Mail / MyMailApp / DLLPath的注册表中引用。

使用Delphi找到示例...