次の方法で共有


CoInitializeEx 関数 (combaseapi.h)

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

Windows ランタイム API を使用する場合、または COM コンポーネントと Windows ランタイム コンポーネントの両方を使用する場合は、CoInitializeEx ではなく、Windows::Foundation::Initialize を呼び出してスレッドを初期化する必要があります。 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の標準戻り値と、次の値を返すことができます。

リターン コード 形容
S_OK
COM ライブラリは、このスレッドで正常に初期化されました。
S_FALSE
COM ライブラリは、このスレッドで既に初期化されています。
RPC_E_CHANGED_MODE
以前の CoInitializeEx 呼び出、このスレッドに互換性のないコンカレンシー モデルを指定しました。 これは、ニュートラルスレッドのアパートメントからシングルスレッドアパートメントへの変更が発生したことを示している可能性もあります。

備考

CoInitializeEx は少なくとも 1 回呼び出す必要があり、通常は COM ライブラリを使用するスレッドごとに 1 回だけ呼び出されます。 同じスレッド CoInitializeEx に対する複数の呼び出しは、同じコンカレンシー フラグを渡す限り許可されますが、後続の有効な呼び出しではS_FALSEが返されます。 コンカレンシー フラグが一致しない場合、呼び出しは失敗し、RPC_E_CHANGED_MODEを返します。 (この規則の目的上、CoInitialize を する呼び出しは、COINIT_APARTMENTTHREADED フラグ CoInitializeEx を呼び出すことと同じです)。スレッドで COM ライブラリを正常に初期化解除するには、CoInitialize または CoInitializeExする各呼び出し (S_FALSEを返す呼び出しを含む) を、対応する呼び出し CoUninitializeによってバランスを取る必要があります。 スレッドで COM が初期化されていない場合は、上記の制約に従って、任意のモードで再初期化できます。

標準アロケーターへのポインターとメモリ割り当て関数を取得するには、CoGetMalloc除くライブラリ関数を呼び出す前に、スレッドで COM ライブラリを初期化する必要があります。 それ以外の場合、COM 関数はCO_E_NOTINITIALIZEDを返します。

シングル スレッド アパートメント (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 アプリ]
ターゲット プラットフォーム の ウィンドウズ
ヘッダー combaseapi.h (Objbase.h を含む)
ライブラリ Ole32.lib
DLL Ole32.dll

関連項目

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