グローバル インターフェイス テーブルの作成
グローバル インターフェイス テーブル オブジェクトを作成し、IGlobalInterfaceTable へのポインターを取得するには 、次の呼び出しを使用します。
HRESULT hr;
hr = CoCreateInstance(CLSID_StdGlobalInterfaceTable,
NULL,
CLSCTX_INPROC_SERVER,
IID_IGlobalInterfaceTable,
(void **)&gpGIT);
if (hr != S_OK) {
exit(0); // Handle errors here.
}
Note
前の呼び出しを使用してグローバル インターフェイス テーブル オブジェクトを作成する場合は、ライブラリ uuid.lib にリンクする必要があります。 これにより、外部シンボルのCLSID_StdGlobalInterfaceTableとIID_IGlobalInterfaceTableが解決されます。
プロセスごとにグローバル インターフェイス テーブルのインスタンスが 1 つ存在するため、プロセス内のこの関数のすべての呼び出しで同じインスタンスが返されます。
CoCreateInstance 関数の呼び出しの後、RegisterInterfaceInGlobal メソッドの呼び出しを使用して、それが存在するアパートメントからのインターフェイスを登録します。 このメソッドは、インターフェイスとその場所を識別する Cookie を提供します。 このインターフェイスへのポインターを探しているアパートメントは、この Cookie を使用して GetInterfaceFromGlobal メソッドを呼び出し、実装は呼び出し元のアパートメントへのインターフェイス ポインターを提供します。 インターフェイスのグローバル登録を取り消すには、任意のアパートメントで RevokeInterfaceFromGlobal メソッドを呼び出すことができます。
IGlobalInterfaceTable を使用する簡単な例は、シングル スレッド アパートメント (STA) 内のオブジェクトのインターフェイス ポインターを別のアパートメントのワーカー スレッドに渡す場合です。 ストリームにマーシャリングし、スレッド パラメーターとしてワーカー スレッドにストリームを渡す必要はなく、 IGlobalInterfaceTable を使用すると、単に Cookie を渡すことができます。
グローバル インターフェイス テーブルにインターフェイスを登録すると、実際のポインターを渡す (ポインターを渡す必要がある場合)、別のアパートメントに移動する nonmethod パラメーター (CreateThread を介して ThreadProc へのパラメーターとして) またはアパートメントの外部からアクセスできるインプロセス メモリに渡す代わりに使用できる Cookie が取得されます。
グローバル インターフェイスを使用すると、複数のスレッドからのグローバル状態への同時アクセスに関連する競合状態や相互除外などの問題を管理するプログラマに余分な負担が生じるので、注意が必要です。
COM には、IGlobalInterfaceTable インターフェイスの標準実装が用意されています。 完全なスレッド セーフ機能を提供するため、この標準実装を使用することを強くお勧めします。
関連トピック