使用 Thread-Safe 对象

适用于:Outlook 2013 | Outlook 2016

客户端应用程序可以假定直接使用或作为回调的对象始终是线程安全的,但以下情况除外:

  • 通过客户端调用 IMAPISession::OpenEntry 获取的传输提供程序的状态对象,该对象具有提供程序的状态表行中的条目标识符。

  • 通过客户端调用 MAPIOpenFormMgr 获取的所有 MAPI 表单对象。 表单对象遵循单元模型规则,客户端必须仅在创建它们的线程上使用它们及其包含的所有对象。

当客户端访问状态表中包含关联状态对象的条目标识符的传输提供程序行时,客户端可以使用该条目标识符调用 OpenEntry 以打开状态对象。 此状态对象不是线程安全的,因为传输提供程序在 MAPI 后台处理程序的上下文中运行,并且不为其状态对象维护单独的上下文。 状态对象遵循单元模型规则,并且客户端必须仅在创建它的线程上使用它。

使用任何 MAPI 对象之前,客户端还必须在每个线程上调用 MAPIInitialize ,并在该使用完成后调用 MAPIUninitialize 。 即使要使用的对象从外部源传递到线程,也应进行这些调用。 MAPIInitializeMAPIUninitialize 可以从除 Win32 DllMain 函数(在初始化和终止进程和线程时或调用 LoadLibrary 函数和 FreeLibrary 函数时由系统调用的函数)中以外的任何位置调用。

不应假定间接使用对象是线程安全的。 间接使用对象由需要目标接口指针作为输入参数的方法返回。 此类方法的示例包括 IMAPIProp::CopyToCopyPropsIMAPIFolder::CopyFolderCopyMessage 以及 IMsgServiceAdmin::CopyMsgService。 如果服务提供程序想要从线程中调用此类对象,而不是从传递它的线程调用此类对象,则提供程序负责显式封送该对象。