描述:
在学习《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中的 IY
private:
// 保存内部组件的 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 了?