COM ライブラリの初期化

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

HRESULT CoInitializeEx(LPVOID pvReserved, DWORD dwCoInit);

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

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

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

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

 

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

Note

実際には、アパートメント スレッドを指定した場合でも、 マーシャリングと呼ばれる手法を使用して、スレッド間でインターフェイスを共有することはできます。 マーシャリングはこのモジュールの範囲外です。 重要な点は、アパートメント スレッド処理では、インターフェイス ポインターを別のスレッドに単にコピーしてはいけません。 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 のエラー コード