加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

聚合实现的示意图

发布时间:2020-12-13 20:39:58 所属栏目:百科 来源:网络整理
导读:以前学《COM技术内幕》的时候,对聚合的一个总结: 代码如下 : 外部组件创建后,接着创建内部组件 IUnknown* pUnknownOuter = this; // this的值为CA CoCreateInstance(CLSID_CB, pUnknownOuter, CLSCTX_INPROC_SERVER, IID_IUnknown, (void**) m_pUnknownInne
以前学《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,

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 ;

}

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读