本記事は、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をインストールする必要がある、なんてことはもう過去の話ですね。


スレッドをどの種類のアパートメントに入らせることが可能かという分類で表にしてみます。

関数STAMTA
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)が可能であることが判明したため、関係する箇所を修正しました。

スポンサード リンク

この記事のカテゴリ

  • ⇒ スレッド初期化・終了関数のまとめ