グローバル インターフェイス テーブルを使用する場合

プロセス内のアパートメント間でインターフェイス ポインターのマーシャリングを複数回解除する場合は、 IGlobalInterfaceTable インターフェイスを使用できます。 他の手法では、毎回再マーシャリングする必要があります。

Note

インターフェイス ポインターが 1 回だけマーシャリングされない場合は、 CoMarshalInterThreadInterfaceInStream 関数を使用できます。 また、同じプロセス内の 1 つのスレッドから別のスレッドにインターフェイス ポインターを渡すためにも使用できます。

 

また、 IGlobalInterfaceTable インターフェイスを使用すると、プログラマにとって以前は難しかったもう 1 つの問題が簡単になります。 この問題は、次の条件に該当する場合に発生します。

  • インプロセス アジャイル オブジェクトは、フリースレッド マーシャラーを集計します。
  • この同じアジャイル オブジェクトは、アジャイルではなく、フリー スレッド マーシャラーを集計しない他のオブジェクトへの (メンバー変数として) インターフェイス ポインターも保持します。

この状況では、外部オブジェクトが別のアパートメントにマーシャリングされ、アプリケーションがそのオブジェクトを呼び出し、オブジェクトがフリースレッドでないメンバー変数インターフェイス ポインターまたは他のアパートメント内のオブジェクトへのプロキシであるいずれかのメンバー変数インターフェイス ポインターを呼び出そうとすると、正しくない結果またはエラー RPC_E_WRONG_THREADが発生する可能性があります。 このエラーは、内部インターフェイスがメンバー変数に最初に格納されたアパートメントからのみ呼び出し可能に設計されているために発生します。

この問題を解決するには、フリー スレッド マーシャラーを集計する外部オブジェクトは、実際のインターフェイス ポインターを格納するのではなく、内部インターフェイスで IGlobalInterfaceTable::RegisterInterfaceInGlobal を呼び出し、結果の Cookie をメンバー変数に格納する必要があります。 外側のオブジェクトが内部オブジェクトのインターフェイス ポインターを呼び出す場合は、 IGlobalInterfaceTable::GetInterfaceFromGlobal を呼び出し、返されたインターフェイス ポインターを使用して解放する必要があります。 外部オブジェクトが削除されると、 IGlobalInterfaceTable::RevokeInterfaceFromGlobal を呼び出して、グローバル インターフェイス テーブルからインターフェイスを削除する必要があります。

グローバルインターフェイステーブルの作成