在学习《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.   

    class CB:public IY,public INondelegatingUnknown 
    struct IY:IUnknown 

    virtual void _stdcall Fy() = 0; 
    }; 
      

  2.   

    其实问题简单点说,就是为了实现组件A聚合组件B的某个接口ISomeInterface;对A初始化的时候,创建内部组件B,并把A的this指针传给B,内部组件返回INondelegatingUnknown接口并传给A的成员变量m_pUnknownInner,最后在A中查询ISomeInterface时,使用了m_pUnknownInner->QueryInterface(...);可是INondelegatingUnknown的定义中没有QueryInterface啊,只有NondelegatingQueryInterface。 这是为什么?
      

  3.   

    前天在潘爱民的专栏上得到的答案:)其实组件之间是靠vtable 来通信的的,而不是C++的类定义..