COM ライブラリの初期化

COM を使用するすべてのWindows プログラムは、CoInitializeEx 関数を呼び出して COM ライブラリを初期化する必要があります。 COM インターフェイスを使用する各スレッドは、この関数を個別に呼び出す必要があります。 CoInitializeEx には、次のシグネチャがあります。

HRESULT CoInitializeEx(LPVOID pvReserved, DWORD dwCoInit);

最初のパラメーターは予約済みであり、 NULL である必要があります。 2 番目のパラメーターは、プログラムで使用するスレッド モデルを指定します。 COM では、 アパートメントスレッド とマルチスレッドの 2 つの異なるスレッドモデル がサポートされています。 アパートメントのスレッド処理を指定すると、次の保証が行われます。

  • 1 つのスレッドから各 COM オブジェクトにアクセスします。複数のスレッド間で COM インターフェイス ポインターを共有しません。
  • スレッドにはメッセージ ループがあります。 (モジュール 1 の ウィンドウ メッセージ を参照)。

これらの制約のいずれかが true でない場合は、マルチスレッド モデルを使用します。 スレッド モデルを指定するには、 dwCoInit パラメーターに次のいずれかのフラグを設定します。

フラグ 説明
COINIT_APARTMENTTHREADED アパートメントはスレッド化されています。
COINIT_MULTITHREADED マルチ スレッド。

 

これらのフラグの 1 つを正確に設定する必要があります。 一般に、ウィンドウを作成するスレッドは COINIT_APARTMENTTHREADED フラグを使用し、他のスレッドは COINIT_MULTITHREADEDを使用する必要があります。 ただし、一部の COM コンポーネントでは、特定のスレッド モデルが必要です。 その場合は、MSDN のドキュメントで説明する必要があります。

注意

実際には、アパートメント スレッドを指定した場合でも、 マーシャリングと呼ばれる手法を使用して、スレッド間でインターフェイスを共有することはできます。 マーシャリングは、このモジュールの範囲外です。 重要な点は、アパートメントのスレッド処理では、インターフェイス ポインターを別のスレッドにコピーしてはいけません。 COM スレッド モデルの詳細については、「 プロセス、スレッド、およびアパートメント」を参照してください。

 

既に説明したフラグに加えて、dwCoInit パラメーターに COINIT_DISABLE_OLE1DDE フラグを設定することをお勧めします。 このフラグを設定すると、古いテクノロジであるオブジェクト リンクと埋め込み (OLE) 1.0 に関連するいくつかのオーバーヘッドが回避されます。

アパートのスレッド処理のために COM を初期化する方法を次に示します。

HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);

HRESULT 戻り値の型には、エラーまたは成功コードが含まれています。 次のセクションでは、COM エラー処理について説明します。

COM ライブラリの初期化解除

CoInitializeEx の呼び出しが成功するたびに、スレッドが終了する前に CoUninitialize を呼び出す必要があります。 この関数はパラメーターを受け取らないし、戻り値を持たない。

CoUninitialize();

次へ

COM のエラー コード