Share via


建立全域介面數據表

使用下列呼叫來建立全域介面數據表物件,並取得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 方法的呼叫,從其所在 Apartment 註冊介面。 這個方法會提供可識別介面及其位置的Cookie。 搜尋此介面指標的 Apartment 接著會使用此 Cookie 呼叫 GetInterfaceFromGlobal 方法,然後實作會提供呼叫 Apartment 的介面指標。 若要撤銷介面的全域註冊,任何 Apartment 都可以呼叫 RevokeInterfaceFromGlobal 方法。

使用 IGlobalInterfaceTable 的簡單範例,就是當您想要將單個線程 Apartment 中物件的介面指標傳遞至另一個 Apartment 中的背景工作線程時。 IGlobalInterfaceTable 可讓您直接傳遞 Cookie,而不需要將其封送處理至數據流,並將數據流傳遞至背景工作線程做為線程參數。

當您在全域介面數據表中註冊介面時,您會收到一個 Cookie,您可以使用它,而不是傳遞實際指標(每當您需要傳遞指標)、移至另一個 Apartment 的非方法參數(透過 CreateThread 將作為 ThreadProc 的參數),或透過 CreateThread 存取的同進程記憶體。

需要注意,因為使用全域介面可讓程式設計人員負擔額外的負擔,例如競爭條件和相互排除等問題,這與同時從多個線程存取全域狀態有關。

COM 提供 IGlobalInterfaceTable 介面的標準實作 強烈建議您使用此標準實作,因為它提供完整的安全線程功能。

使用全域介面數據表的時機