在学习《COM技术内幕》聚合的程序时,遇到了困难,希望能得到大家的帮助。为了实现聚合,使用了两个IUnknown接口:
struct IUnknown
{
virtual HRESULT _stdcall QueryInterface(const IID&, void **) = 0;
..
..
};struct INondelegatingUnknown
{
virtual HRESULT _stdcall NondelegatingQueryInterface(const IID&, void **) = 0;
..
..
};// 这个两个接口之间有没有什么继承关系?struct IX:IUnknown
{
virtual void _stdcall Fx() = 0;
};struct IY:IUnknown
{
virtual void _stdcall Fy() = 0;
};外部组件
class CA:public IX
{
public:
// IUnknown
virtual HRESULT _stdcall QueryInterface(const IID&, void **)
{
...
...
}
..
..
// IX
virtual void _stdcall Fx();
// 聚合组件CB中的 IYprivate:
// 保存内部组件的 Unknown
IUnknown *m_pUnkownInner;
};内部组件,继承了 IY 和 INondelegatingUnknown
class CB:public IY,public INondelegatingUnknown
{
public:
// IUnknown
virtual HRESULT _stdcall QueryInterface(const IID&, void **);
..
..
// INondelegatingUnknown
virtual HRESULT _stdcall NondelegatingQueryInterface(const IID&, void **);
..
..
// IY  
  virtual void _stdcall Fy();
private:
m_pUnkownOuter;
};组件CA在初始化的时候,将创建CB,并把CA的this指针传给CB的成员变量m_pUnkownOuter。创建CB后会返回INondelegatingUnknown指针,并传给外部组件CA的成员变量m_pUnkownInner。
为什么在CA中查询IY接口,却使用m_pUnkownInner->QueryInterface(...),
可是INondelegatingUnknown中没有QueryInterface这个成员函数...另外在程序中出现了这样的转换 ?
reinterpret_cast<IUnknown *>(static_cast<INondelegatingUnknown *>(this))另外:
在QueryInterface的最后,会出现这样的转换:
reinterpret_cast<IUnknown *>(*ppv)->AddRef();
为什么不用 static_cast 了?

解决方案 »

  1.   

    all interface should inherit from IUnknown
      

  2.   

    reinterpret_cast<IUnknown *>(static_cast<INondelegatingUnknown *>(this))
    这句话什么意思
    static_cast<INondelegatingUnknown *>(this)之后
    调用m_pUnkownInner->QueryInterface(...),
    实际上就变成了
    m_pUnkownInner->INondelegatingUnknown(...),
    从而避免死循环。
    又在前面加上reinterpret_cast<IUnknown *> 是什么意思 转换后还能有前面的效果么?
      

  3.   

    reinterpret_cast<IUnknown *>(static_cast<INondelegatingUnknown *>(this))
    这句话什么意思
    static_cast<INondelegatingUnknown *>(this)之后
    调用m_pUnkownInner->QueryInterface(...),
    实际上就变成了
    m_pUnkownInner->INondelegatingUnknown(...),
    从而避免死循环。
    又在前面加上reinterpret_cast<IUnknown *> 是什么意思 转换后还能有前面的效果么?
      

  4.   

    第一个问题:在CA中查询IY接口,却使用m_pUnkownInner->QueryInterface(...)。楼主不要被这句代码的表面意思蒙蔽了,m_pUnkownInner指向的是内部组件CB的INondelegatingUnknown接口,此处对于INondelegatingUnknown接口地址重新解释了(reinterpret_cast),所以m_pUnkownInner->QueryInterface(...)相当于调用了INondelegatingUnknown::NondelegatingQueryInterface。第二个问题;reinterpret_cast<IUnknown *>(static_cast<INondelegatingUnknown *>(this)),这句代码得到的地址还是CB中INondelegatingUnknown接口的地址,这样做是为了赋值给m_pUnkownInner,因为它是IUnknown *类型的指针