为什么呢?
我在看<<COM技术内幕>>聚合章节的时候,有些地方不是很明白。比如CB实现了INondelegatingUnknown和IY,其中IY继承IUnknown,CA是CB的外部组件,我的理解是CB里面有一个m_pUnknownOuter指针,当CB通过构造函数构造的时候,如果带入的pUnknownOuter不为空(说明有组件要聚合)那么让m_pUnknownOuter=pUnknownOuter,这样对CB进行查询的时候,全部转发给了CA。当pUnknownOuter=NULL的时候,说明没有组件要聚合它,所以令m_pUnknownOuter指向INondelegatingUnknown接口,这样CB就可以当一般的组件一样使用,不知道我的理解对不对?如果是这样,那么为什么在CB的类厂里面CreateInstance的时候,只允许返回IUnknown(实际为INondelegatingUnknown)的接口呢?那如果我要通过CB的类厂得到其它接口怎么办?先得到IUnknown,然后再Query?何必多此一举呢?
我在看<<COM技术内幕>>聚合章节的时候,有些地方不是很明白。比如CB实现了INondelegatingUnknown和IY,其中IY继承IUnknown,CA是CB的外部组件,我的理解是CB里面有一个m_pUnknownOuter指针,当CB通过构造函数构造的时候,如果带入的pUnknownOuter不为空(说明有组件要聚合)那么让m_pUnknownOuter=pUnknownOuter,这样对CB进行查询的时候,全部转发给了CA。当pUnknownOuter=NULL的时候,说明没有组件要聚合它,所以令m_pUnknownOuter指向INondelegatingUnknown接口,这样CB就可以当一般的组件一样使用,不知道我的理解对不对?如果是这样,那么为什么在CB的类厂里面CreateInstance的时候,只允许返回IUnknown(实际为INondelegatingUnknown)的接口呢?那如果我要通过CB的类厂得到其它接口怎么办?先得到IUnknown,然后再Query?何必多此一举呢?
解决方案 »
- 求高人指点!关于文件查找的程序
- 用VC++写一个很简单的IE插件
- 谁清楚 RepositionBars()这个函数给讲讲?
- 怎样对父窗口进行数据更新
- 关于akiko(弥弥) 的代码!求助
- 大侠们!!怎么让静态文本框的背景变成透明的啊!!
- 谁能给我一个VC加上SQL做的通讯录程序的原代码
- 怎样设置相对路径啊?
- 快来帮帮我,求救!!!!!!!
- VC中如何取到存储过程Output参数返回的值?请给出思路,谢谢了先。
- 请问这几家游戏公司怎么样?
- 紧急求助!!sql.Format("SELECT count(*) as lCount FROM Power WHERE HostIP='%s'", IP);
2、如果B组件是被聚合的,那在创建的时候,CB的类厂里面的CreateInstance确实只返回IUnknown(实际为INondelegatingUnknown)的接口,然后赋值给CA中的m_pIUnknownInner。然后调用CA的QueryInterface函数,得到你想要的CB中的某个接口。
首先这个不是多此一举呀,因为你不会总是希望得到固定的某个接口啊,如果下次你希望得到的是另外的接口呢。
返回以后可以再查询其它接口那是另外一回事啊。
HRESULT CBFactory::CreateInstance(IUnknown *pUnknownOuter,
const IID& iid,
void **ppv)
对IID还有限制吗?
书上说:当一个组件被聚合时,此内部组件将只能返回一个IUnknown接口,这是由于外部组件在其他时候无法获取非代理未知接口的指针(INondelegatingUnknown),因QueryInterface调用将被转发到外部未知接口(IUnknown)m_pUnknownInner 要存放内部对象的IUnknown接口指针,而只有在创建B的时候才可能返回INondelegatingUnknown指针。用QueryInterface只能返回外部对象的IUnknown指针。所以,创建内部对象需要制定IID_IUnknown