建立全域介面數據表
使用下列呼叫來建立全域介面表物件,並取得 IGlobalInterfaceTable指標:
HRESULT hr;
hr = CoCreateInstance(CLSID_StdGlobalInterfaceTable,
NULL,
CLSCTX_INPROC_SERVER,
IID_IGlobalInterfaceTable,
(void **)&gpGIT);
if (hr != S_OK) {
exit(0); // Handle errors here.
}
注意
使用上述呼叫建立全域介面數據表物件時,必須連結至連結庫 uuid.lib。 這會解析外部符號CLSID_StdGlobalInterfaceTable和IID_IGlobalInterfaceTable。
每個進程都有全域介面數據表的單一實例,因此進程中的所有呼叫此函式都會傳回相同的實例。
在呼叫 CoCreateInstance 函式後,請先從其所在的單元註冊介面,然後再呼叫 RegisterInterfaceInGlobal 方法。 這個方法會提供可識別介面及其位置的Cookie。 尋找此介面指標的 Apartment 接著會使用此 Cookie 呼叫 GetInterfaceFromGlobal 方法,然後該實作會提供介面指標給呼叫的 Apartment。 若要撤銷介面的全域註冊,任何 Apartment 都可以呼叫 RevokeInterfaceFromGlobal 方法。
使用 IGlobalInterfaceTable 的簡單範例,就是當您想將單執行緒套間 (STA) 中物件的介面指標傳遞到另一個套間的背景工作執行緒時。 IGlobalInterfaceTable 可讓您直接傳遞 Cookie,而不需要將其封送處理至數據流,並將數據流傳遞至工作執行緒作為執行緒參數。
當您在全域介面表中註冊介面時,您會收到一個 Cookie,您可以使用它來代替傳遞指標,每當您需要將指標傳遞時,不論是作為參數移至另一個 apartment 的非方法參數(例如作為參數從 ThreadProc 經由 CreateThread)或是到可在 apartment 外部存取的進程內記憶體。
需要注意,因為使用全域介面可讓程式設計人員負擔額外的負擔,例如競爭條件和相互排除等問題,這與同時從多個線程存取全域狀態有關。
COM 提供 IGlobalInterfaceTable 介面的標準實作。 強烈建議您使用此標準實作,因為它提供完整的安全線程功能。
相關主題