Thread-Safe オブジェクトの使用

適用対象: Outlook 2013 | Outlook 2016

クライアント アプリケーションでは、次の場合を除き、直接またはコールバックとして使用されるオブジェクトは常にスレッド セーフであると想定できます。

  • プロバイダーの状態テーブル行からのエントリ識別子を持つ IMAPISession::OpenEntry へのクライアント呼び出しによって取得されたトランスポート プロバイダーの状態オブジェクト。

  • MAPIOpenFormMgr へのクライアント呼び出しによって取得されたすべての MAPI フォーム オブジェクト。 フォーム オブジェクトはアパートメント モデルルールに従い、クライアントはそれらを使用し、作成したスレッドにのみ含まれるすべてのオブジェクトを使用する必要があります。

クライアントは、関連付けられている状態オブジェクトのエントリ識別子を含む状態テーブルのトランスポート プロバイダーの行にアクセスすると、そのエントリ識別子を使用して OpenEntry を呼び出して状態オブジェクトを開くことができます。 トランスポート プロバイダーは MAPI スプーラーのコンテキストで実行され、状態オブジェクトの別のコンテキストを維持しないため、この状態オブジェクトはスレッド セーフではありません。 status オブジェクトはアパートメント モデルルールに従い、クライアントはそれを作成したスレッドでのみ使用する必要があります。

クライアントは、MAPI オブジェクトを使用する前にすべてのスレッドで MAPIInitialize を呼び出し、その使用が完了したときに MAPIUninitialize を呼び出す必要もあります。 これらの呼び出しは、使用するオブジェクトが外部ソースからスレッドに渡された場合でも行う必要があります。 MAPIInitializeMAPIUninitialize は、Win32 DllMain 関数、プロセスとスレッドの初期化と終了時、または LoadLibrary 関数と FreeLibrary 関数の呼び出し時にシステムによって呼び出される関数を除き、どこからでも呼び出すことができます。

間接使用オブジェクトは、スレッド セーフと見なすべきではありません。 間接使用オブジェクトは、入力パラメーターとして宛先インターフェイス ポインターを必要とするメソッドによって返されます。 このようなメソッドの例としては、 IMAPIProp::CopyToCopyPropsIMAPIFolder::CopyFolderCopyMessageIMsgServiceAdmin::CopyMsgService などがあります。 サービス プロバイダーが、渡されたスレッド以外のスレッドからこのようなオブジェクトを呼び出す場合、プロバイダーはオブジェクトを明示的にマーシャリングする必要があります。