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

要求

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

另请参阅