COM ライブラリの初期化
COM を使用するすべての Windows プログラムは、CoInitializeEx 関数を呼び出して COM ライブラリを初期化する必要があります。 COM インターフェイスを使用する各スレッドは、この関数を個別に呼び出す必要があります。 CoInitializeEx のシグネチャは次のとおりです。
HRESULT CoInitializeEx(LPVOID pvReserved, DWORD dwCoInit);
最初のパラメーターは予約済みであり、NULL である必要があります。 2 番目のパラメーターは、プログラムが使用するスレッド モデルを指定します。 COM では、スレッド化 apartment thread と multithreaded の 2 つの異なるスレッド モデルがサポートされています。 アパートメント スレッドを指定する場合、次の保証が行われます。
- 1 つのスレッドから各 COM オブジェクトにアクセスします。複数のスレッド間で COM インターフェイス ポインターは共有しません。
- スレッドにはメッセージ ループがあります。 (モジュール 1 の Window Messages を参照してください。)
これらの制約のいずれかが true でない場合は、マルチスレッド モデルを使用します。 スレッド モデルを指定するには、dwCoInit パラメーターに次のいずれかのフラグを設定します。
フラグ | 説明 |
---|---|
COINIT_APARTMENTTHREADED | Apartment threaded。 |
COINIT_MULTITHREADED | Multithreaded。 |
これらのフラグの 1 つだけを設定する必要があります。 一般に、ウィンドウを作成するスレッドは COINIT_APARTMENTTHREADED フラグを使用し、他のスレッドは COINIT_MULTITHREADED を使用する必要があります。 ただし、一部の COM コンポーネントには特定のスレッド モデルが必要です。
Note
実際には、アパートメントスレッドを指定した場合でも、marshaling と呼ばれる手法を使用して、スレッド間でインターフェイスを共有することは可能です。 マーシャリングは、このモジュールでは扱いません。 重要な点は、アパートメントのスレッド処理では、インターフェイス ポインターを別のスレッドにコピーしてはいけません。 COM スレッド モデルの詳細については、「Processes, Threads, and Apartments」(プロセス、スレッド、アパートメント) を参照してください。
既に説明したフラグに加えて、dwCoInit パラメーターに COINIT_DISABLE_OLE1DDE フラグを設定することをお勧めします。 このフラグを設定すると、古いテクノロジであるオブジェクト リンクと埋め込み (OLE) 1.0 に関連するいくつかのオーバーヘッドが回避されます。
アパートメントのスレッド処理のために COM を初期化する方法を次に示します。
HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
HRESULT 戻り値の型には、エラーまたは成功コードが含まれています。 次のセクションでは、COM エラー処理について説明します。
COM ライブラリの初期化解除
CoInitializeEx を正常に呼び出すたびに、スレッドが終了する前に CoUninitialize を呼び出す必要があります。 この関数はパラメーターを取らず、戻り値はありません。
CoUninitialize();
次へ