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 接口 的特定查询必须始终返回相同的指针值。 这使客户端可以通过调用 QueryInterfaceIID_IUnknown 比较结果来确定两个指针是否指向同一组件。 具体而言,对于除 IUnknown 以外的接口的查询 (即使通过同一个指针) 相同的接口也必须返回相同的指针值,情况并非如此。

对于 QueryInterface (的实现有四个要求,在这些情况下,“必须成功”意味着“必须成功,才能阻止灾难性故障”。) 。

  • 通过 QueryInterface 在对象上访问的接口集必须是静态的,而不是动态的。 这意味着,如果对指向指定接口的指针的 QueryInterface 调用第一次成功,则必须再次成功。 如果第一次调用失败,则必须在所有后续调用上失败。
  • 它必须具有反射性 — 如果客户端持有指向对象上的接口的指针,并且客户端查询该接口,则调用必须成功。
  • 它必须是对称的-如果持有指向一个接口的指针的客户端成功为另一个接口查询,则通过获取的第一个接口的指针的查询必须成功。
  • 它必须是可传递的— 如果持有指向一个接口的指针的客户端成功查询第二个接口,并且通过该指针查询成功用于第三个接口,则通过第三个接口的指针对第一个接口的查询必须成功。

实现者的说明

QueryInterface 的实现绝不能检查 ACL。 此规则的主要原因是 COM 要求支持特定接口的对象在查询该接口时始终返回成功。 另一个原因是,在 QueryInterface 上检查 ACL 不提供任何真正的安全性,因为任何有权访问特定接口的客户端都可以将其直接交给另一个客户端,而无需任何回叫服务器。 此外,由于 COM 缓存接口指针,因此每次客户端执行查询时,它都不会在服务器上调用 QueryInterface

要求

   
最低受支持的客户端 Windows 2000 Professional [仅限桌面应用]
最低受支持的服务器 Windows 2000 Server [仅限桌面应用]
目标平台 Windows
标头 unknwn.h

另请参阅