多个组件可以组成一个组件用于向外部提供服务,这多个组件的组合方式分为包容和聚合,包容是指一个组件作为外部组件,包含内部组件,并且把外部组件的调用转发给内部组件,包容的例子如下:
struct IUnKnown{
virtual HRESULT QueryInterface(const IID& iid, void ** ppv) = 0;
virtual ULONG AddRef() = 0;
virtual ULONG Release() = 0;
};
//interface IX, assume iid is IID_IX
struct IX :public IUnKnown{
virtual void Fx()=0;
};
//interface IY, assume iid is IID_IY
struct IY:public IUnKnown{
virtual void Fy() = 0;
};
class CA:public IX, public IY{
public:
HRESULT QueryInterface(const IID& iid, void** ppv)
{
if(iid == IID_IUnknown)
*ppv = static_cast<IX*>(this);
else if(iid == IID_IX)
*ppv = static_cast<IX*>(this);
else if(iid == IID_IY)
//component1组件的客户请求IID_IY组件时,返回component1的IY接口
*ppv = static_cast<IY*>(this);
else if(iid == IID_CA)
*ppv = static_cast<CA*>(this);
else
{
*ppv = 0;
return 0;
}
AddRef();
return 1;
}
ULONG AddRef()
{
return ++m_refc;
}
ULONG Release()
{
if(0 == --m_refc)
delete this;
return m_refc;
}
void Fx(){::std::cout<< "fx"<<::std::endl;}
void Fy(){m_pIY->Fy();}
//component1组件的客户请求IID_IY的函数,将其转发给内部组件component2
private:
ULONG m_refc;
IY* m_pIY;
public:
CA(){m_refc=0; m_pIY = NULL;}
virtual ~CA()
{
if(NULL!=m_pIY)
{
m_pIY->Release();
m_pIY = NULL;
}
}
//component1组件在创建后在内部创建component2组件
HRESULT Init()
{
HRESULT hr = ::CoCreateInstance(
CLSID_component2,NULL,CLSCTX_INPROC_SERVER,IID_IY,&m_pIY);
if(succeed(hr))
{
return S_OK;
}
else
{
m_pIY = NULL;
return E_FAIL;
}
}
};