当我学习COM的聚合时,我知道COuterclass::pUnkInner
指向CInnerclass::INondelegationUnknown
界面,而CInnerclass::QueryInterface
不属于INondelegationUnknown
,所以为什么pUnkInner
可以调用QueryInterface
,例如pUnkInner->QueryInterface
。
答案 0 :(得分:0)
不确定INondelegationUnknown
是什么 - 这不是COM的一部分,可能特定于您正在使用的框架。
但关键部分是,聚合的内部对象必须提供两种截然不同的IUnknown
实现。一个是委托实现 - 当首次建立聚合关系时,它将所有对IUnknown
指针的调用转发到CoCreateInstance
中的外部。内部公开的所有接口必须以这种方式实现其三个IUnknown
方法。外部将这些接口交给外部客户端 - 通过委托外部,保持单个无缝对象的错觉。
另一个IUnknown
实现管理引用计数并公开由内部对象本身实现的接口(如常规COM对象) - 这是非委托实现,外部类用于管理内部。它从未暴露在外部。外部在其自己的QueryInterface
实现中使用这个非委托指针来获取内部实现的接口(然后将它们交给客户端),并最终释放内部。