结束 MAPI 会话

适用于:Outlook 2013 | Outlook 2016

客户端可以立即或在处理所有出站消息后以及发生严重错误时响应用户的请求来结束其会话。 某些客户端需要保持登录状态,以便挂起的出站消息可以访问传输提供程序和目标消息传送系统。 如果此类客户端发送消息并立即注销,则消息可能会保留在传出队列中,直到用户重新登录并保持足够长的登录时间,以便传输消息。

需要终止使用 MAPI 子系统的会话时

  1. 通过调用每个已注册对象的 Unadvise 方法取消所有通知的注册。

  2. 通过调用其 IUnknown::Release 方法释放所有打开的对象。 打开对象的类型可以包括建议接收器、状态表、发件箱文件夹、一个或多个邮件存储和通讯簿。

  3. 调用 MAPIFreeBuffer 以释放任何缓存条目标识符的内存,例如 PR_IPM_SUBTREE_ENTRYID (PidTagIpmSubtreeEntryId) 。

  4. 调用 IMAPISession::Logoff,设置MAPI_LOGOFF_UI标志(如果允许用户界面)和MAPI_LOGOFF_SHARED标志(如果拥有当前共享会话)。 注销 通知使用当前共享会话的所有其他客户端应通过发送错误通知来注销。

  5. 通过调用会话的 IUnknown::Release 方法释放会话指针。

  6. 如果在会话启动期间调用 OleInitialize 来初始化 OLE 库,请立即调用 OleUninitialize 取消初始化它们。 只有调用 OleInitialize 的客户端才能调用 OleUninitialize

  7. 通过调用 MAPIUninitialize 取消初始化 MAPI 库。 如果在某个时候调用了 OleInitialize,请确保在此调用 MAPIUninitialize 之前调用 OleUninitialize 时机至关重要。 如果调用 OleUninitialize 后调用 MAPIUninitialize,则客户端可能会意外终止。

  8. 如果在会话启动期间调用 ScInitMapiUtil 来初始化 MAPI 实用工具库,请通过调用 DeinitMapiUtil 立即取消初始化它。 只有调用 ScInitMapiUtil 的客户端才能调用 DeinitMapiUtil

注意

必须在调用 IMAPISession::Logoff 之前释放所有打开的对象。 调用 Logoff 后保持打开状态的对象将变为无效;他们不能接受任何呼叫,并且可能永远无法释放。 如果对其中一个对象进行了调用,则预计调用会失败。

MAPI 没有用于在会话关闭过程中删除 DLL 的机制。 仅当配置客户端(如 控制面板)使用 MSG_SERVICE_INSTALL 事件调用其消息服务入口点函数时,才能删除服务提供程序的 DLL。