初始化 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 元件需要特定的線程模型。
注意
實際上,即使您指定 Apartment 線程,仍可使用稱為 封送處理的技術,在線程之間共用介面。 封送處理超出此課程模組的範圍。 重點是,使用 Apartment 線程,您絕不能只將介面指標複製到另一個線程。 如需 COM 線程模型的詳細資訊,請參閱進程、線程和 Apartment。
除了已經提及的旗標之外,最好在 dwCoInit 參數中設定COINIT_DISABLE_OLE1DDE旗標。 設定此旗標可避免與對象連結和內嵌 (OLE) 1.0 相關的一些額外負荷,這是過時的技術。
以下是您將 COM 初始化 Apartment 線程的方式:
HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
HRESULT 傳回類型包含錯誤或成功碼。 我們將在下一節中查看 COM 錯誤處理。
取消初始化 COM 連結庫
對於每個成功呼叫 CoInitializeEx,您必須在線程結束之前呼叫 CoUninitialize。 此函式不接受任何參數,而且沒有傳回值。
CoUninitialize();
下一步