加载消息存储提供程序

适用于:Outlook 2013 | Outlook 2016

当客户端应用程序打开消息存储时,MAPI 会将消息存储提供程序的 DLL 加载到内存中。 MAPI 加载 DLL 后,消息存储提供程序和 MAPI 之间将发生非常具体的方法调用序列。 此方法调用序列使 MAPI 能够获取顶级 IMSProvider : IUnknownIMSLogon : IUnknownIMsgStore : IMAPIProp 接口,并允许消息存储提供程序获取 MAPI 支持对象。 在调用序列之后,消息存储提供程序应准备好接受来自客户端的登录。

加载消息提供程序 DLL 时的调用顺序如下:

  1. 客户端调用 IMAPISession::OpenMsgStore

  2. 如果消息存储尚未打开,MAPI 将加载存储提供程序的 DLL 并调用 DLL 的 MSProviderInit 入口点。 如果消息存储已打开,MAPI 将跳过步骤 2 和 3,然后使用现有的 IMSProvider : IUnknown 接口来完成步骤 4。

  3. MSProviderInit 创建并返回 IMSProvider 对象。

  4. MAPI 调用 IMSProvider::Logon,传递客户端应用程序的消息存储项标识符。

  5. IMSProvider::Logon 创建并返回 IMSLogon : IUnknown 接口和 IMsgStore : IMAPIProp 接口,然后在其 IMAPISupport : IUnknown 接口上调用 IUnknown::AddRef 方法。 如果客户端的消息存储项标识符引用已打开的消息存储,则消息存储提供程序可以返回现有的 IMSLogonIMsgStore 接口,并且不需要对其支持对象调用 AddRef

  6. 如果客户端在登录时未设置MAPI_NO_MAIL标志,并且未在步骤 1 中设置MDB_NO_MAIL,则 MAPI 会将消息存储的条目标识符提供给 MAPI 后台处理程序,以便 MAPI 后台处理程序可以登录到消息存储。

  7. MAPI 将 IMsgStore 接口返回到客户端。

  8. MAPI 后台处理程序调用 IMSProvider::SpoolerLogon

  9. IMSProvider::SpoolerLogon 从步骤 5 返回相同的 IMSLogonIMsgStore 接口。

注意

如果由于提供了不正确的密码而对消息存储提供程序的登录调用失败,并且消息存储提供程序无法显示要求正确密码的接口,则它应从 IMSProvider::Logon 方法返回MAPI_E_FAILONEPROVIDER。 这将允许客户端提示用户输入密码,以便再次尝试登录到消息存储提供程序,而不是导致 MAPI 在整个会话中使提供程序失败。

另请参阅

开发 MAPI 邮件存储提供程序