本記事は、COM Advent Calendar 2014 – Qiitaの2日目の記事です。
COMを使用するスレッドでは、CoInitializeEx/CoUninitializeなどを呼ばなければならないのはご存じと思います。実は結構種類があるので、その一覧をまとめてみようと思い立ちました。
- CoInitialize, CoInitializeEx / CoUninitialize
- 通常のCOM初期化・終了処理。CoInitializeは、CoInitializeExにCOINIT_APARTMENTTHREADEDを指定するのと同じ。
- OleInitialize / OleUninitialize
- STAスレッドとして初期化し、OLE用の追加処理を行う。
- RoInitialize, Windows::Foundation::Initialize / RoUninitialize, Windows::Foundation::Uninitialize
- Windows Runtime用の初期化を行う。おそらくCoInitializeEx系の上位互換と思われる。Windows 8で追加された。Windows::Foundationの関数はRo関数の単なるラッパー。
Windows 95でCoInitializeExを使うにはDCOM for Windows 95をインストールする必要がある、なんてことはもう過去の話ですね。
スレッドをどの種類のアパートメントに入らせることが可能かという分類で表にしてみます。
関数 | STA | MTA |
---|---|---|
CoInitializeEx系 | ○ | ○ |
OleInitialize系 | ○ | × |
RoInitialize系 | ○ | ○ |
Windows 8のWinRT APIで増えたASTAもあるのですが、ここに載せていません。RoInitializeやその他公開されている情報の限りでは、ASTA所属のスレッドは自分で作れないためです。
RoInitialize系は少し分かりにくかったのでここに書いておきます。MSDNライブラリのRO_INIT_TYPE enumerationにはMTAを指定するRO_INIT_MULTITHREADEDしか載っていませんが、Windows::Foundation::Initializeの記事にはSTAを指定するRO_INIT_SINGLETHREADEDが記載されています。実際にはwinrt/roapi.hに2つ揃ってRO_INIT_TYPE列挙体として定義されています。
昨日と合わせて初期化関数の話を2つしたので、終了関数の話も2つしなければいけないのかなとちょっと思っています。
2015年5月5日追記:RoInitializeでSTAの指定(RO_INIT_SINGLETHREADED)が可能であることが判明したため、関係する箇所を修正しました。
スポンサード リンク |
この記事のカテゴリ
- COM ⇒ スレッド初期化・終了関数のまとめ