为什么呢?
我在看<<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?何必多此一举呢?
解决方案 »
- 可以在对话框上嵌入Excel表格吗
- sdk中,ScrollWindow会引发WM_PAINT吗?
- 请解释一下这三个语句
- 寻找 GNU/Linux编程指南(第二版)电子书,高分相送。
- 求true type文件格式的详细说明?
- 关于CAsyncSocket编程,请高手指教,ONLINE WAIT!!
- 快帮帮忙吧。怎样在一个用MFC Appwizard生成的对话框中生成一个capCreateCaptureWindow()窗口?
- 如何将BSTR指向中的内容放到char[],在线等候?
- COM规范的中文版
- error C2662: 'SetSize' : cannot convert 'this' pointer from 'const class CStringArray' to 'class CStringArray &'请教个伟大虾这是为什么?
- 请问这几家游戏公司怎么样?
- 紧急求助!!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