初始化 COM 程式庫
任何使用 COM 的 Windows 程式都必須呼叫 CoInitializeEx 函 式來初始化 COM 程式庫。 每個使用 COM 介面的執行緒都必須對這個函式進行個別呼叫。 CoInitializeEx 具有下列簽章:
HRESULT CoInitializeEx(LPVOID pvReserved, DWORD dwCoInit);
第一個參數是保留的,而且必須是 Null。 第二個參數會指定程式將使用的執行緒模型。 COM 支援兩種不同的執行緒模型: Apartment 執行緒 和 多執行緒。 如果您指定 Apartment 執行緒,您會進行下列保證:
- 您將從單一線程存取每個 COM 物件;您不會在多個執行緒之間共用 COM 介面指標。
- 執行緒會有訊息迴圈。 (請參閱模組 1.) 中的視窗訊息
如果上述任一條件約束不是 true,請使用多執行緒模型。 若要指定執行緒模型,請在 dwCoInit 參數中設定下列其中一個旗標。
旗標 | 描述 |
---|---|
COINIT_APARTMENTTHREADED | Apartment 執行緒。 |
COINIT_MULTITHREADED | 多執行緒。 |
您必須設定這其中一個旗標。 一般而言,建立視窗的執行緒應該使用 COINIT_APARTMENTTHREADED 旗標,而其他執行緒應該使用 COINIT_MULTITHREADED。 不過,某些 COM 元件需要特定的執行緒模型。 MSDN 檔應該會告訴您該情況的時機。
注意
實際上,即使您指定 Apartment 執行緒,仍可使用稱為封 送處理的技術,線上程之間共用介面。 封送處理超出此課程模組的範圍。 重點是,使用 Apartment 執行緒時,您絕對不能直接將介面指標複製到另一個執行緒。 如需 COM 執行緒模型的詳細資訊,請參閱進程、執行緒和 Apartment。
除了已提及的旗標之外,最好在dwCoInit參數中設定COINIT_DISABLE_OLE1DDE旗標。 設定此旗標可避免與物件連結和內嵌 (OLE) 1.0 相關的額外負荷,這是過時的技術。
以下是初始化 APARTMENT 執行緒 COM 的方式:
HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
HRESULT傳回類型包含錯誤或成功碼。 我們將在下一節中查看 COM 錯誤處理。
取消初始化 COM 程式庫
對於每次成功呼叫 CoInitializeEx,您必須先呼叫 CoUninitialize ,執行緒才會結束。 此函式不採用任何參數,而且沒有傳回值。
CoUninitialize();
下一個
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應