Win32 App Initializing the COM Library - yoshimune/LearningDirectX11 GitHub Wiki

This page refers to 【Initializing the COM Library?

COMを使うWindowsプログラムのうちいくつかは、COMライブラリをCoInitializeExを呼び出して初期化する必要があります。COMインターフェイスを使用するスレッドは、それぞれ個別にこの関数を呼び出す必要があります。CoInitializeExは以下のとおりです。

HRESULT CoIntializeEx(LPVOID pvReserved, DWORD dwCoInit);

最初の引数は予約済みで、必ずNULLとなります。二番目の引数は、プログラムが使用するスレッディングモデルを指定します。COMは2つの異なるスレッディングモデルをサポートします。_apartment threaded_と_multithreaded_です。もしapartment threadingを指定した場合、以下のような制約があります。

  • シングルスレッドでそれぞれのCOMオブジェクトにアクセスします。複数のスレッド感でCOMインターフェイスポインタの共有はできません。
  • スレッドはメッセージループを持ちます

もしいずれかの制約が守られない場合、multithreadedモデルを使用します。スレッディングモデルを支持する場合は_dwCoInit_引数内のフラグのうち一つをセットします。

Flag Description
COINIT_APARTMENTTHREADED Apartment threaded.
COINIT_MULTITHREADED Multithreaded.

これらのフラグのうち一つを正確にセットする必要があります。一般的に。ウィンドウを作成するスレッドはCOINIT_APARTMENTTHREADEDフラグを使用すべきです。それ以外のスレッドはCOINIT_MULTITHREADEDを使用すべきです。しかし、いくつかのCOMコンポーネントは、特定のスレッディングモデルを要求します。そのような場合は、MSDNドキュメント を参照してください。

実際、たとえapartment threadingを支持したとしても、_marshaling_というテクニックを使えば、スレッド間でインターフェイスの共有が可能です。マーシャリングはこのモジュールの責任範囲を超えています。重要なポイントは、apartment threadingでは、インターフェイスのポインタを単純に別のスレッドにコピーしないということです。より詳細は以下を参考にしてくださいProcesses, Threads, and ApartmentsUnderstanding and Using COM Threading Models

既に言及したフラグに加えて、_dwCoInit_の引数のCOINIT_DISABLE_OLE1DDEフラグをセットすると良いでしょう。このフラグの設定は、いくつかの古い技術である「OLE(Object Linking Embedding)1.0」に関するオーバーヘッドを回避します。

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

HRESULTはエラーまたは成功コードを含むタイプを返します。COMのエラーハンドリングは次のセクションで取り扱います。

Uninitializing the COM Library

CoInitilizeExが成功した場合は、CoUnInitializeをスレッド終了前に呼び出す必要があります。この関数は引数も戻り値もありません

CoUninitialize();

Next:Win32 App Error Codes in COM