QueryInterface
虽然存在一些机制供对象静态地表达功能(在实例化之前),但是基本 COM 机制将使用名为 QueryInterface
的 IUnknown
方法。
每个接口都派生自 IUnknown
,因此每个接口都有一个实现 QueryInterface
。 无论实现如何,此方法都会使用调用方想要一个指向接口的 IID
的指针来查询对象。 如果对象支持该接口,则 QueryInterface
检索指向接口的指针,同时调用 AddRef
。 否则,它将返回 E_NOINTERFACE
错误代码。
请注意,必须随时遵守引用计数规则。 如果调用接口指针上的 Release
将引用计数递减为零,则不应再次使用该指针。 有时,可能需要获取对对象的弱引用(也就是说,可能获取指向其中一个接口的指针,而无需递增引用计数),但通过调用 QueryInterface
后跟的 Release
来执行此操作是不可接受的。 以这种方式获取的指针无效,不应使用。 定义 _ATL_DEBUG_INTERFACES
时,这更容易变得明显,因此定义此宏是查找引用计数 bug 的有用方法。