CoInitializeEx 関数 (combaseapi.h)
呼び出し元スレッドが使用する COM ライブラリを初期化し、スレッドのコンカレンシー モデルを設定し、必要に応じてスレッドの新しいアパートメントを作成します。
Windows ランタイム API を使用する場合、または COM コンポーネントと Windows ランタイム コンポーネントの両方を使用する場合は、Windows::Foundation::Initialize を呼び出して、CoInitializeEx の代わりにスレッドを初期化する必要があります。 Windows::Foundation::Initialize は COM コンポーネントに使用するのに十分です。
構文
HRESULT CoInitializeEx(
[in, optional] LPVOID pvReserved,
[in] DWORD dwCoInit
);
パラメーター
[in, optional] pvReserved
このパラメーターは予約済みであり、 NULL である必要があります。
[in] dwCoInit
スレッドのコンカレンシー モデルと初期化オプション。 このパラメーターの値は、 COINIT 列挙型から取得されます。 COINIT の値の任意の組み合わせを使用できますが、COINIT_APARTMENTTHREADEDフラグとCOINIT_MULTITHREADED フラグの両方を設定することはできません。 既定値は COINIT_MULTITHREADED です。
戻り値
この関数は、E_INVALIDARG、E_OUTOFMEMORY、E_UNEXPECTEDの標準戻り値と、次の値を返すことができます。
リターン コード | 説明 |
---|---|
|
このスレッドで COM ライブラリが正常に初期化されました。 |
|
COM ライブラリは、このスレッドで既に初期化されています。 |
|
以前の CoInitializeEx の呼び出しで、このスレッドのコンカレンシー モデルがマルチスレッド アパートメント (MTA) として指定されました。 これは、ニュートラル スレッドアパートメントからシングルスレッドアパートメントへの変更が発生したことを示している可能性もあります。 |
注釈
CoInitializeEx は少なくとも 1 回呼び出す必要があり、通常は COM ライブラリを使用するスレッドごとに 1 回だけ呼び出されます。 同じスレッドによる CoInitializeEx への複数の呼び出しは、同じコンカレンシー フラグを渡す限り許可されますが、後続の有効な呼び出しはS_FALSEを返します。 スレッドで COM ライブラリを正常に閉じるには、 CoInitialize または CoInitializeEx への呼び出しが成功するたびに (S_FALSEを返す呼び出しを含む)、 CoUninitialize への対応する呼び出しとバランスを取る必要があります。
標準アロケーターとメモリ割り当て関数へのポインターを取得するには、 CoGetMalloc を除くいずれかのライブラリ関数を呼び出す前に、スレッドで COM ライブラリを初期化する必要があります。
それ以外の場合、COM 関数はCO_E_NOTINITIALIZEDを返します。
スレッドのコンカレンシー モデルを設定した後は、変更できません。 以前にマルチスレッドとして初期化されたアパートメントで CoInitialize を呼び出すと失敗し、RPC_E_CHANGED_MODEが返されます。
シングル スレッド アパートメント (STA) で作成されたオブジェクトは、アパートメントのスレッドからのみメソッド呼び出しを受け取るので、呼び出しはシリアル化され、メッセージ キューの境界 ( PeekMessage または SendMessage 関数が呼び出された場合) にのみ到着します。
マルチスレッド アパートメント (MTA) の COM スレッドで作成されたオブジェクトは、いつでも他のスレッドからメソッド呼び出しを受信できる必要があります。 通常は、重要なセクション、セマフォ、ミューテックスなどの同期プリミティブを使用して、オブジェクトのデータを保護するために、マルチスレッド オブジェクトのコードに何らかの形式のコンカレンシー制御を実装します。
ニュートラル スレッド アパートメント (NTA) で実行するように構成されたオブジェクトが STA または MTA のいずれかのスレッドによって呼び出されると、そのスレッドは NTA に転送されます。 このスレッドが後で CoInitializeEx を呼び出すと、呼び出しは失敗し、RPC_E_CHANGED_MODEが返されます。
OLE テクノロジはスレッド セーフではないので、 OleInitialize 関数は、COINIT_APARTMENTTHREADED フラグを使用して CoInitializeEx を 呼び出します。 その結果、マルチスレッド オブジェクトコンカレンシー用に初期化されたアパートメントでは、 OleInitialize で有効な機能を使用できません。
インプロセス サーバーの読み込みまたはアンロードの順序を制御する方法がないため、DllMain 関数から CoInitialize、CoInitializeEx、または CoUninitialize を呼び出さないでください。
要件
サポートされている最小のクライアント | Windows 2000 Professional [デスクトップ アプリ |UWP アプリ] |
サポートされている最小のサーバー | Windows 2000 Server [デスクトップ アプリ |UWP アプリ] |
対象プラットフォーム | Windows |
ヘッダー | combaseapi.h (Objbase.h を含む) |
Library | Ole32.lib |
[DLL] | Ole32.dll |