书中152页,HRESULT __stdcall CA::Init()函数的实现部分,黑体字,  hr = m_pUnknownInner->QueryInterface(IID_IY,(void**)&m_pIY);为什么是QueryInterface()函数,而不是NondelegatingQueryInterface()函数?

解决方案 »

  1.   

    这本书我没有看过,但是我觉得这个例子是出现在讲聚合的章节中。
    CA聚合了CB的情况下
    你看看在CB类厂的CreateInstrance函数是不是用了非委托查询接口函数(nondelegatingQueryInterface)?
    这个函数返回的指针是一个指向父类INondelegationUnknown的
    这句hr = m_pUnknownInner->QueryInterface(IID_IY,(void**)&m_pIY);最终调用的也是NondelegatingQueryInterface函数
    你调试一下就可以看到了。
      

  2.   

    CB是这样定义的:class CB:public IY,public INondelegatingUnknown
    {
       //实现部分;
    }
    CB类厂的CreateInstrance函数确实用了nondelegatingQueryInterface()函数,
    返回的指针(m_pUnknownInner)也是指向INondelegationUnknown,
    但是,m_pUnknownInner应该是不能调用QueryInterface,它没有这个成员函数,
    它有函数NondelegatingQueryInterface()。
    为什么?
      

  3.   

    请问mickeyfirst(黑梦):
                          在函数NondelegatingQueryInterface()结尾有一句话:
                           reinterpret_cast<IUnknow*>(*ppv)->AddRef();
    是干什么用的?
      

  4.   

    不要拘泥于函数的名称!!所谓调用函数,最重要是要地址正确参数都能匹配上,这里对CA来说他认为m_pUnknownInner是一个IUnknown指针,所以请注意调用QueryInterface的物理意义是以m_pUnknownInner所指向的内存的第一个4字节(QueryInterface的地址)作为函数地址来调用,同时传入参数,对于CB来说,他返回的指针所指向的内存结构是符合这个要求的,所以不会出错。这里体现了COM接口的本质,他只是一块内存结构。
      

  5.   

    >>在函数NondelegatingQueryInterface()结尾有一句话:
     >>reinterpret_cast<IUnknow*>(*ppv)->AddRef();道理和刚才说的差不多,因为非代理接口和IUnknown的内存结构一致,所以这样转型是没问题的。
      

  6.   

    高手不敢当。有什么问题的话很愿意和你探讨。可以用csdn给我发短消息。