为什么pUnkInner可以在COM的聚合中调用QueryInterface?

时间:2016-08-24 08:12:23

标签: com aggregation

当我学习COM的聚合时,我知道COuterclass::pUnkInner指向CInnerclass::INondelegationUnknown界面,而CInnerclass::QueryInterface不属于INondelegationUnknown,所以为什么pUnkInner可以调用QueryInterface,例如pUnkInner->QueryInterface

1 个答案:

答案 0 :(得分:0)

不确定INondelegationUnknown是什么 - 这不是COM的一部分,可能特定于您正在使用的框架。

但关键部分是,聚合的内部对象必须提供两种截然不同的IUnknown实现。一个是委托实现 - 当首次建立聚合关系时,它将所有对IUnknown指针的调用转发到CoCreateInstance中的外部。内部公开的所有接口必须以这种方式实现其三个IUnknown方法。外部将这些接口交给外部客户端 - 通过委托外部,保持单个无缝对象的错觉。

另一个IUnknown实现管理引用计数并公开由内部对象本身实现的接口(如常规COM对象) - 这是非委托实现,外部类用于管理内部。它从未暴露在外部。外部在其自己的QueryInterface实现中使用这个非委托指针来获取内部实现的接口(然后将它们交给客户端),并最终释放内部。