组件被聚合时调用的奇怪问题
潘爱民《COM原理与应用》第四章实例:
有两个组件:CB和CA,其中CA被CB聚合
CA实现了两个接口:INondelegationUnknown和ISomeInterface,分别对应了两个接口查询函数:CA::NondelegationQueryInterface(iid,ppv)和CA::QueryInterface(iid,ppv);
客户程序在构造CB对象时调用CB::init()函数,该函数主要语句如下:
::CoCreateInstance(CLSID_CompA, pUnknownOuter,CLSCTX_INPROC_SERVER, IID_IUnknown, (void **)& m_pUnknownInner) ;//用于构造CA对象
result = m_pUnknownInner->QueryInterface(IID_SomeInterface, (void **)&m_pSomeInterface);//用于获得CA对象的IID_SomeInterface接口
问题是:为什么m_pUnknownInner->QueryInterface()没有去调用CA的QueryInterface呢?为什么调用的是CA的NondelegationInterface呢?(这个我是可以确认的,确实是这样,因为我分别在两个函数内加了不同的输出语句!而且如果真的调用CA的QueryInterface,经过分析必然会造成死循环。)