代码如下:
外部组件创建后,接着创建内部组件
IUnkNown* pUnkNownOuter = this; // this的值为&CA
CoCreateInstance(CLSID_CB,
pUnkNownOuter,
CLSCTX_INPROC_SERVER,
IID_IUnkNown,
(void**)&m_pUnkNownInner);
m_pUnkNownInner为外部组件的成员
{
IClassFactory* pIFactory = NULL;
CoGetClassObject(CLSID_IB,
NULL,
IID_IClassFactory,
(void**)&pIFactory);
pIFactory->CreateInstace(pUnkNownOuter,iid,ppv);
}
CreateInstace(IUnkNown* pUnkNownOuter,const IID& iid,void** ppv)
{
//只能被IID_IUnkNown接口聚合
if ((pUnkNownOuter != NULL) && (iid != IID_IUnkNown))
{
return CLASS_E_NOAGGREGATION ;
}
CB* pB = new(pUnkNownOuter);
pB->NonQueryInterface(iid,ppv);
}
CB::NonQueryInterfacer(IID& iid,void** ppv)
{
if (iid = IID_IUnkNown)
*ppv = static_cast<INonUnkNown*>(this);
}
实际上CB的构造函数是这样的:
CB::CB(IUnkNown* pUnkNownOuter) : m_cRef(1)
{
::InterlockedIncrement(&g_cComponents) ;
if (pUnkNownOuter == NULL) //不使用聚合,转换成非委托接口
{
m_pUnkNownOuter = reinterpret_cast<IUnkNown*>
(static_cast<INondelegatingUnkNown*>
(this)) ;
}
else
{ //使用聚合 转换成外部接口
m_pUnkNownOuter = pUnkNownOuter ;
}
}