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