2016-08-24 29 views
0

当我学习COM的聚集,我知道COuterclass::pUnkInnerCInnerclass::INondelegationUnknown接口,而CInnerclass::QueryInterface不属于INondelegationUnknown,为什么pUnkInner可以调用QueryInterface,例如,pUnkInner->QueryInterface为什么pUnkInner可以在COM的聚合中调用QueryInterface?

+0

您可以*总是*调用接口指针上的QueryInterface。您可能错过的细节是INondelegationUnknown从IUnknown派生,就像所有的COM接口一样。因此继承了三种IUnknown方法。我们从这里看不到它,但这是正常的方式。 –

+0

从哪里学习COM? – acelent

回答

0

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

但是关键的一点是,这种聚合的内部对象必须提供两种不同的实现方式IUnknown。一种是委托实现 - 当聚合关系第一次建立时,它将所有调用转发给外部提供的IUnknown指针CoCreateInstance。内部暴露的所有接口都必须以这种方式实现它们的三个IUnknown方法。外部人员将这些接口交给外部客户端 - 通过委托给外部,维持单个无缝对象的错觉。

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

相关问题