共用方式為


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

如果您在處理中的 Apartment 之間多次取消分頁介面指標,您可以使用 IGlobalInterfaceTable 介面。 使用其他技術,您每次都必須重新分割。

注意

如果介面指標只取消分流一次,您可能想要使用 CoMarshalInterThreadInterfaceInStream 函式。 它也可以用來將介面指標從一個線程傳遞至相同進程中的另一個線程。

 

IGlobalInterfaceTable 介面也讓程式設計人員更容易遇到另一個先前的困難問題。 套用下列條件時,就會發生此問題:

  • 處理中的敏捷式物件會匯總自由線程封送處理器。
  • 這個相同的敏捷式物件也會保存非敏捷式且不會匯總自由線程封送處理器之其他物件的介面指標。

在此情況下,如果外部物件被封送處理至另一個 Apartment,而應用程式會在其上呼叫 ,而且對象會嘗試在其任何成員變數介面指標上呼叫,這些指標不是自由線程,或是其他 Apartment 中物件的 Proxy,它可能會取得不正確的結果或錯誤RPC_E_WRONG_THREAD。 之所以發生此錯誤,是因為內部介面的設計只能從第一個儲存在成員變數中的 Apartment 呼叫。

若要解決此問題,匯總自由線程封送處理器的外部對象應該在內部介面上呼叫 IGlobalInterfaceTable::RegisterInterfaceInGlobal ,並將產生的 Cookie 儲存在其成員變數中,而不是儲存實際的介面指標。 當外部物件想要在內部物件的介面指標上呼叫時,它應該呼叫 IGlobalInterfaceTable::GetInterfaceFromGlobal、使用傳回的介面指標,然後釋放它。 當外部物件消失時,它應該呼叫 IGlobalInterfaceTable::RevokeInterfaceFromGlobal ,以從全域介面數據表中移除介面。

建立全域介面數據表