为什么呢?
我在看<<COM技术内幕>>聚合章节的时候,有些地方不是很明白。比如CB实现了INondelegatingUnknown和IY,其中IY继承IUnknown,CA是CB的外部组件,我的理解是CB里面有一个m_pUnknownOuter指针,当CB通过构造函数构造的时候,如果带入的pUnknownOuter不为空(说明有组件要聚合)那么让m_pUnknownOuter=pUnknownOuter,这样对CB进行查询的时候,全部转发给了CA。当pUnknownOuter=NULL的时候,说明没有组件要聚合它,所以令m_pUnknownOuter指向INondelegatingUnknown接口,这样CB就可以当一般的组件一样使用,不知道我的理解对不对?如果是这样,那么为什么在CB的类厂里面CreateInstance的时候,只允许返回IUnknown(实际为INondelegatingUnknown)的接口呢?那如果我要通过CB的类厂得到其它接口怎么办?先得到IUnknown,然后再Query?何必多此一举呢?

解决方案 »

  1.   

    1、如果B组件是正常创建的,那在创建的时候可以保证返回你想要的接口。
    2、如果B组件是被聚合的,那在创建的时候,CB的类厂里面的CreateInstance确实只返回IUnknown(实际为INondelegatingUnknown)的接口,然后赋值给CA中的m_pIUnknownInner。然后调用CA的QueryInterface函数,得到你想要的CB中的某个接口。
    首先这个不是多此一举呀,因为你不会总是希望得到固定的某个接口啊,如果下次你希望得到的是另外的接口呢。
      

  2.   

    但是代码里面看得出来,如果B组件被聚合,那么CB类厂里面的CreateInstance只能返回IUnknown,而不能为其他,我不明白为什么?如果没有聚合,CB的类厂里面的CreateInstance没有这个限制阿。
    返回以后可以再查询其它接口那是另外一回事啊。
      

  3.   

    “CB类厂里面的CreateInstance只能返回IUnknown,而不能为其他”是什么意思?
    HRESULT CBFactory::CreateInstance(IUnknown *pUnknownOuter, 
                    const IID& iid,
                                       void **ppv)
    对IID还有限制吗?
      

  4.   

    楼上:书上说只能查询IUnknown,查出来以后可以再QueryInterface
      

  5.   

    书上说:当一个组件被聚合时,此内部组件将只能返回一个IUnknown接口,这是由于外部组件在其他时候无法获取非代理未知接口的指针(IDelegatingUnknown),因QueryInterface调用将被转发到外部未知接口(IUnknown)m_pUnknownInner 要存放内部对象的IUnknown接口指针,而只有在创建B的时候才可能返回INondelegatingUnknown指针。用QueryInterface只能返回外部对象的IUnknown指针。所以,创建内部对象需要制定IID_IUnknown
      

  6.   

    写错了,重发:
    书上说:当一个组件被聚合时,此内部组件将只能返回一个IUnknown接口,这是由于外部组件在其他时候无法获取非代理未知接口的指针(INondelegatingUnknown),因QueryInterface调用将被转发到外部未知接口(IUnknown)m_pUnknownInner 要存放内部对象的IUnknown接口指针,而只有在创建B的时候才可能返回INondelegatingUnknown指针。用QueryInterface只能返回外部对象的IUnknown指针。所以,创建内部对象需要制定IID_IUnknown
      

  7.   

    在被聚合的情况下,内部组件的IClassFactory组件必须使用INodelegatingUnknown接口而不能再使用IUnknown.但是INodelegatingUnknown接口指针的获得只能在IClassFactory::CreateInstance()的时候获得(因为QueryInterface调用将被转发倒外部未知接口),所以就规定这个地方返回IUnknown *了