聚合实现的示意图

 以前学《COM技术内幕》的时候,对聚合的一个总结:


   

代码如下: 

外部组件创建后,接着创建内部组件 

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, 

CLSCTX_INPROC_SERVER, 

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 ; 

 } 

} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值