CoInitializeEx 函式 (combaseapi.h)
初始化 COM 連結庫以供呼叫線程使用、設定線程的並行模型,並視需要建立線程的新 Apartment。
如果您想要使用 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 為此線程指定了不相容的並行模型。 這也可能表示已從中性線程 Apartment 變更為單個線程 Apartment。 |
言論
CoInitializeEx 至少必須呼叫一次,而且通常只針對使用 COM 連結庫的每個線程呼叫一次。 只要相同線程傳遞相同的並行旗標,就允許多個呼叫 CoInitializeEx,但後續的有效呼叫會傳回S_FALSE。 如果並行旗標不相符,則呼叫會失敗並傳回RPC_E_CHANGED_MODE。 (為了此規則的目的,呼叫 CoInitialize 相當於使用 COINIT_APARTMENTTHREADED 旗標呼叫 coInitializeEx。若要在線程上正常初始化 COM 連結庫,每個成功呼叫 CoInitialize 或 CoInitializeEx,包括傳回S_FALSE的任何呼叫,都必須透過對應呼叫 來平衡 CoUninitialize。 在線程上取消初始化 COM 之後,您就可以在任何模式中重新初始化它,但受限於上述條件約束。
您必須先在線程上初始化 COM 連結庫,才能呼叫除了 CoGetMalloc以外的任何連結庫函式,以取得標準配置器的指標,以及記憶體配置函式。 否則,COM 函式會傳回CO_E_NOTINITIALIZED。
在單個線程 Apartment (STA) 中建立的物件只會從 Apartment 的線程接收方法呼叫,因此呼叫會串行化並只抵達消息佇列界限(呼叫 PeekMessage 或 SendMessage 函式時)。
在多線程 Apartment (MTA) 的 COM 線程上建立的對象必須能夠隨時接收來自其他線程的方法呼叫。 您通常會使用重要區段、號誌或 Mutex 等同步處理基本類型,在多線程物件的程式代碼中實作某種形式的並行控制,以協助保護對象的數據。
當設定為在中性線程 Apartment (NTA) 中執行的物件是由 STA 或 MTA 中的線程呼叫時,該線程會傳輸到 NTA。 如果這個線程後續呼叫 CoInitializeEx,則呼叫會失敗並傳回RPC_E_CHANGED_MODE。
由於 OLE 技術不是安全線程,因此 OleInitialize 函式會使用 COINIT_APARTMENTTHREADED 旗標 CoInitializeEx 呼叫。 因此,針對多線程物件並行初始化的 Apartment 無法使用 OleInitialize所啟用的功能。
由於無法控制載入或卸除同進程伺服器的順序,因此請勿
要求
要求 | 價值 |
---|---|
最低支援的用戶端 | Windows 2000 專業版 [傳統型應用程式 |UWP 應用程式] |
支援的最低伺服器 | Windows 2000 Server [傳統型應用程式 |UWP 應用程式] |
目標平臺 | 窗戶 |
標頭 | combaseapi.h (include Objbase.h) |
連結庫 | Ole32.lib |
DLL | Ole32.dll |