CoInitializeEx 関数 (combaseapi.h)

呼び出し元のスレッドで使用する COM ライブラリを初期化し、スレッドのコンカレンシー モデルを設定し、必要に応じてスレッドの新しいアパートメントを作成します。

Windows ランタイム API を使用する場合、または COM コンポーネントと Windows ランタイム コンポーネントの両方を使用する場合は、Windows::Foundation::Initialize を呼び出して、CoInitializeEx ではなくスレッドを初期化する必要があります。 COM コンポーネントに使用するには、Windows::Foundation::Initialize で十分です。

構文

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、および次の値を返すことができます。

リターン コード 説明
S_OK
COM ライブラリがこのスレッドで正常に初期化されました。
S_FALSE
COM ライブラリは、このスレッドで既に初期化されています。
RPC_E_CHANGED_MODE
以前の 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 関数から CoInitializeCoInitializeEx、または CoUninitialize を呼び出さないでください。

要件

要件
サポートされている最小のクライアント Windows 2000 Professional [デスクトップ アプリ |UWP アプリ]
サポートされている最小のサーバー Windows 2000 Server [デスクトップ アプリ |UWP アプリ]
対象プラットフォーム Windows
ヘッダー combaseapi.h (Objbase.h を含む)
Library Ole32.lib
[DLL] Ole32.dll

こちらもご覧ください

プロセス、スレッド、およびアパートメント