组件中引入INondelegatingUnknown

在聚合中,客户永远只知道有外组件的存在,也永远只与外组件打交道,即使客户可以得到内组件的接口。

外组件聚合内组件时,在内组件中有代理和非代理。

 

1.为什么要在内组件中引入INondelegatingUnknown?

内组件和外组件都有一个IUnknown接口。

如果不聚合,那么:客户通过外组件接口查询IUnknown接口时,会得到一个地址A;

                  客户通过内组件接口查询IUnknown接口时,会得到一个地址B;

                  这两个地址是不同的。

为了保证客户每次查询IUnknown接口时,都会得到地址A,

所以,必须在内组件中引入和IUnknown有相同作用的非代理接口INondelegatingUnknown,

这样,内组件中就有了两个接口:IUnknown和INondelegatingUnknown。

IUnknown中有:QueryInterface、AddRef、Release,它们就是代理

INondelegatingUnknown中有:

NondelegatingQueryInterface、NondelegatingAddRef、NondelegatingRelease,它们就是非代理

IUnknown中的QueryInterface中会调用m_pUnknownOuter->QueryInface(iid, ppv),作用是把查询转给外组件,这样客户查询接口时,都会调用外组件的QueryInterface。

INondelegatingUnknown中的NondelegatingQueryInterface,作用是在内组件中查询。

 

2.什么时候使用代理?

客户通过内组件接口QueryInterface查询内组件的接口时才使用代理。

 

3.什么时候使用非代理?

客户通过外组件接口QueryInterface查询内组件的接口时才使用非代理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值