以下问题都来自书本《COM技术内幕》1.(P143,第二段)通过m_pUnknownInner 调用QueryInterface可以获取一个IID_IY接口指针,m_pUnknownInner是指向INondelegatingUnknown接口的,此接口并没有实现QueryInterface,而是NondelegatingQueryInterface,这如何实现的?
2.(P143,第三段)释放IY接口可能会导致系统释放它所占用的资源,因此当调用Release时,应使用传给CoCreateInstance的那个指针,这是怎么回事?
3.(P144,上面的程序代码)
if(FAILED(hr))
{
    m_pUnknowInner->Release();
    return E_FAIL;
}
为什么失败了还要进行释放?
4.(P144,倒数第二段)否则最后一个Rlease调用将使外部组件的引用计数变成0,从而会导致此组件试图再次将自己释放,"再次"怎么理解?内部组件和外部组件的释放的过程是怎样的?
5.(P184,第二段)若CA同时继承了CUnknown和IUnknown,那么它还是需要实现Unknown中的纯虚函数?CUnknown不是已经实现了IUnknown中的虚函数吗?
(P184,第三段)这样一来,CA的实现将使CUnknown中的实现无效,这说的是什么意思?望各位帮帮忙,谢谢!

解决方案 »

  1.   

    家庭作业吗?if(FAILED(hr))
    {
      m_pUnknowInner->Release();
      return E_FAIL;
    }
    这里的FAILED()表示本次操作失败了。但是一般执行一次操作时都会要调用一次AddRef()的,也就是增加一次对XX接口的调用了。而这里的Release()并不一定是释放,只是相对AddRef()的++运算符的--运算符,可以抵消掉前次失败操作自增的引用次数。
      

  2.   

    TO: 二楼不算作业吧。自己在学习COM,看这本书有蛮多地方不太清楚。
    查询操作失败后,不会调用一次AddRef吧,一般AddRef调用放在QueryInterface函数中最后面,如果失败,应该提前就返回了。