IUnknown::QueryInterface (REFIID,void**) 方法 (unknwn.h)

查詢 COM 物件,以取得其其中一個介面的指標;透過介面標識碼的參考來識別介面, (IID) 。 如果 COM 物件實作 介面,則在呼叫 IUnknown::AddRef 之後,它會傳回該介面的指標。

語法

HRESULT QueryInterface(
  REFIID riid,
  void   **ppvObject
);

參數

riid

類型: REFIID

所查詢介面標識碼的參考 (IID) 。

ppvObject

類型: void**

具有 riid 參數中所指定 IID 之介面的指標位址。 因為您傳遞介面指標的位址,所以 方法可以使用查詢之介面的指標覆寫該位址。 成功傳回時, *ppvObject (取值位址) 包含所要求介面的指標。 如果物件不支援 介面,方法會將 *ppvObject (取值位址) 為 nullptr

傳回值

如果支援 介面,則這個方法會 傳回S_OK ,否則 會傳回 E_NOINTERFACE 。 如果 ppvObject (位址) 為 nullptr,則此方法會 傳回E_POINTER

備註

對於任何指定的 COM 物件 (也稱為 COM 元件) ,任何物件介面上 IUnknown 介面 的特定查詢都必須一律傳回相同的指標值。 這可讓客戶端判斷兩個指標是否指向相同的元件,方法是呼叫具有IID_IUnknown和比較結果的 QueryInterface。 特別是,查詢 IUnknown 以外的介面 (即使是透過相同指標的相同介面,) 也必須傳回相同的指標值。

QueryInterface (的實作有四個需求。在這些情況下,「必須成功」表示「必須成功嚴重失敗」。) 。

  • 透過 QueryInterface 在物件上存取的介面集合必須是靜態的,而不是動態的。 這表示,如果第一次對指定介面指標的 QueryInterface 呼叫成功,則必須再次成功。 如果第一次呼叫失敗,則所有後續呼叫都必須失敗。
  • 它必須是自反的—如果客戶端在物件上保存介面的指標,而且客戶端會查詢該介面,則呼叫必須成功。
  • 它必須是對稱的,如果擁有某個介面指標的用戶端成功查詢另一個介面,則透過第一個介面取得的指標的查詢必須成功。
  • 它必須可轉移—如果用戶端成功查詢第二個介面的指標,而且透過該指標查詢成功進行第三個介面,則透過第三個介面的指標,第一個介面的查詢必須成功。

實作者的注意事項

QueryInterface 的實作絕對不能檢查 ACL。 此規則的主要原因是 COM 要求支援特定介面的物件一律會在查詢該介面時傳回成功。 另一個原因是檢查 QueryInterface 上的 ACL 不會提供任何真正的安全性,因為任何可存取特定介面的用戶端都可以直接將它交給另一個用戶端,而不需要對伺服器進行任何呼叫。 此外,因為 COM 會快取介面指標,所以每次用戶端執行查詢時,都不會在伺服器上呼叫 QueryInterface

規格需求

需求
最低支援的用戶端 Windows 2000 Professional [僅限傳統型應用程式]
最低支援的伺服器 Windows 2000 Server [僅限桌面應用程式]
目標平台 Windows
標頭 unknwn.h

另請參閱