MAPI のスレッド処理

適用対象: Outlook 2013 | Outlook 2016

スレッドは、オペレーティング システムが CPU 時間を割り当てる基本的なエンティティです。 スレッドには独自のレジスタ、スタック、優先度、ストレージがありますが、アドレス空間を共有し、アクセス トークンなどのリソースを処理します。 スレッドはメモリも共有し、あるスレッドは別のスレッドが書き込んだことを読み取ります。

MAPI クライアントは、次の汎用スレッド モデルを使用します。

スレッド モデル 説明
単一スレッド モデル
すべてのオブジェクトは、単一スレッドで使用されます。
アパートメントスレッドモデル
オブジェクトは、オブジェクトを作成したスレッドでのみ使用できます。
フリー スレッド、またはスレッド パーティ、モデル
オブジェクトは、任意のスレッドで使用できます。

MAPI では、任意のスレッドでいつでも使用できるスレッド セーフ オブジェクトをサポートする、無料のスレッド モデルを使用します。 OLE では、アパートメント スレッド モデルが使用されます。 アパートメント スレッド モデルは、オブジェクトを作成したスレッド以外のスレッドがそのオブジェクトを使用する必要がある場合に明示的に転送する必要があるオブジェクトをサポートします。

OLE が 1 つのスレッドから別のスレッドにオブジェクトを転送するために使用するメカニズムは、マーシャリングと呼ばれます。 マーシャリングには、スタブ オブジェクトとプロキシ オブジェクトが含まれます。 これらの特殊なオブジェクトは、マーシャリングするオブジェクト内のインターフェイスのパラメーターをパッケージ化し、これらのパラメーターを他のスレッドに転送し、到着時にパッケージ化解除します。 2 つのマルチスレッド モデル間の競合は、OLE "軽量" リモート プロシージャ コールまたは LRPC を使用して、フリースレッド MAPI オブジェクトが別のプロセスに送信されるときに発生します。 LRPC は、スタブ インターフェイスとプロキシ インターフェイスをオブジェクトとその呼び出し元の間のアパートメント スレッド動作と組み合わせて、オブジェクトのセマンティクスをフリー スレッドからアパートメント スレッドに変更します。 この競合につながる MAPI の状況の認識は、クライアントとサービス プロバイダーが問題の発生を防ぐのに役立ちます。

MAPI オブジェクトにアクセスできます。

  • MAPILogonEx から返されるセッション オブジェクトなど、クライアントのプロセスにリンクされているサービス プロバイダーまたは MAPI によって返されるインターフェイス ポインターを使用して、メソッドへの直接呼び出しを通じて。

  • IMAPIFolder::CopyFolder 内の別のフォルダーからコピーされたフォルダー オブジェクトなど、任意のサービス プロバイダーから返されるインターフェイス ポインターを使用して、メソッドへの間接呼び出しを通じて。

  • サービス プロバイダーまたは MAPI に渡される IMAPIAdviseSink::OnNotify メソッドなどのコールバック関数を使用して 、アドバイズ 呼び出しまたは長い操作の進行状況を表示できるメソッド。