次の方法で共有


COM ライブラリの初期化

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

HRESULT CoInitializeEx(LPVOID pvReserved, DWORD dwCoInit);

最初のパラメーターは予約済みであり、NULL である必要があります。 2 番目のパラメーターは、プログラムが使用するスレッド モデルを指定します。 COM では、スレッド化 apartment threadmultithreaded の 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();

次へ

COM のエラー コード