选择要加载的特定版本 MAPI
适用于:Outlook 2013 | Outlook 2016
显式链接到 MAPI 的实现时,必须仔细选择要加载的实现。
有两种方法可以显式链接到 MAPI 的实现。
加载 MAPI 存根库,并在注册表中指定要加载和调度 MAPI 调用的自定义 DLL。 或者,
实现 MAPI 客户端查找算法,查找默认邮件客户端使用的 MAPI 版本并加载它。
由于可以更改 Mapi32.dll 存根注册表设置 以指示应用程序使用 MAPI 的任何实现,因此建议指导应用程序使用已测试的 MAPI 实现。 下面介绍了显式链接的两种方法。
从注册表读取 MAPI 实现信息
指示邮件客户端的自定义 DLL 的注册表项位于邮件客户端的键下
HKLM\Software\Clients\Mail
。下表描述了这些键:
键 说明 MSIComponentID Windows Installer PublishComponent 类别 ID (GUID) ,用于标识导出简单 MAPI 或 MAPI 调用的 DLL。 如果设置了,则此密钥优先于 DLLPath 或 DLLPathEx 键。 MSIApplicationLCID 应用程序的区域设置标识符 (LCID) 。 第一个字符串值标识来自 HKLM\Software
的子项,后续字符串值标识包含区域设置信息的此键下方的注册表值。MSIOfficeLCID 适用于 Microsoft Office 的 LCID。 第一个字符串值标识来自 HKLM\Software
的子项,后续字符串值标识此键下面的注册表值。从这些密钥获取信息。
将上一步中获取的值传递到 FGetComponentPath 函数。 FGetComponentPath 是由 MAPI 存根库 Mapistub.dll 导出的函数。 它返回自定义版本的 MAPI 的路径。
加载标记为默认的 MAPI 的实现
HKLM\Software\Clients\Mail::(default)
读取注册表值。如前所述,查找所指示客户端的信息。
注意
请注意,默认邮件客户端可能不会实现扩展 MAPI。
示例
若要加载由 Outlook 实现的 MAPI,请在 下 HKLM\Software\Clients\Mail\Microsoft Outlook
查找注册表项并将其传递给 FGetComponentPath。
FGetComponentPath 将返回 Outlook 实现 MAPI 的路径。
如果未设置密钥 MSIComponentID、MSIApplicationLCID 和 MSIOfficeLCID,检查 DLLPathEx 注册表值。 如果设置了密钥, FGetComponentPath 会提供客户端实现 MAPI 的路径。
实现 MAPI 客户端查找算法
下表列出了 MFCMAPI 中用于查找 MAPI 自定义实现路径的四个函数:
函数 | 说明 |
---|---|
GetMAPIPath |
获取 MAPI 库路径。 |
GetMailKey |
获取 MAPI 邮件注册表项。 |
GetMapiMsiIds |
获取 Windows 安装程序标识符。 |
GetComponentPath |
使用 FGetComponentPath 获取组件路径。 |
由于 MFCMAPI 默认加载 MAPI 的默认实现,因此如果要使用 MAPI 的其他实现,则必须显式指示它执行此操作。 这是通过使用 Session\Load MAPI 例程执行的。
这些函数的工作原理
MFCMAPI 调用
GetMAPIPath
,为客户端参数传递 NULL 以加载默认 MAPI 实现。GetMAPIPath
调用GetMapiMsiIds
以读取 MSIComponentID、 MSIApplicationLCID 和 MSIOfficeLCID 的值。GetMapiMsiIds
调用GetMailKey
以打开默认邮件客户端的注册表项。GetMapiMsiIds
使用 返回的GetMailKey
注册表句柄来查找 MSIComponentID、 MSIApplicationLCID 和 MSIOfficeLCID 的值。MSIComponentID、MSIApplicationLCID 和 MSIOfficeLCID 的值将
GetMAPIPath
返回到 。GetMAPIPath
然后将它们传递给GetComponentPath
。GetComponentPath
从系统目录加载 MAPI 存根库 Mapi32.dll。GetComponentPath
然后,从 Mapi32.dll 检索 FGetComponentPath 函数的地址,前提是 Mapi32.dll 导出 FGetComponentPath。如果从 Mapi32.dll 获取 FGetComponentPath 的地址失败,
GetComponentPath
则从 Mapistub.dll 检索地址。GetComponentPath
然后调用 FGetComponentPath,获取默认版本的 MAPI 的路径。GetMAPIPath
然后将此路径返回到调用方,然后调用方加载 MAPI 并显式链接到它,如 链接到 MAPI 函数中所述。
注意
- 若要为英语和非英语区域设置支持 MAPI 的本地化副本,
GetMAPIPath
请读取 MSIApplicationLCID 和 MSIOfficeLCID 子项的值。GetMAPIPath
然后调用 FGetComponentPath,首先将 MSIApplicationLCID 指定为 szQualifier,然后再次将 MSIOfficeLCID 指定为 szQualifier。 有关支持非英语语言的邮件客户端的注册表项的详细信息,请参阅 为 MAPI DLL 设置 MSI 密钥。 - 如果 MFCMAPI 未使用
GetMAPIPath
接收 MAPI 的路径,它将从系统目录加载 MAPI 存根库。 - 显式将 MAPI 调用映射到 MAPI DLL 中讨论的 MSMapiApps 注册表值仅适用于使用 MAPI 存根库的情况。 加载 MAPI 的特定实现或加载默认实现的应用程序不必设置 MSMapiApps 注册表项。