com的问题,请求帮忙,必给分!

hackerning 2002-04-06 01:02:15
书上关于聚合是这样说的:
内部组件的非委托UNKNOW接口只能由外部组件获得,当组件被聚合,委托UNKNOW接口将把所有的QUERYINTERFACE,ADDREF,RELEASE调用转发给外部组件。
我想如果是这样的话,那么比如CA是一个外部组件,CB是一个被它聚合的内部组件,CA想用CB中的IY接口,按照原理就是CA从CB获得IY的接口指针,但是就如上面所说,当组件被聚合,委托UNKNOW接口将把所有的QUERYINTERFACE,ADDREF,RELEASE调用转发给外部组件。CA的请求一到CB就被转发了,应该就又变回调用CA的QUERYINTERFACE了,而CA的QUERYINTERFACE在找IY接口时又通过内部组件指针调用了它的m_punknowinner->queryinterface,这不成了个死循环了吗,想的我 头都大了,它最终还是无法获得内部的IY接口指针啊 ????!!!!!!、、
有谁能解释一下,一定给分的
...全文
10 点赞 收藏 3
写回复
3 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
mul 2002-04-07
可以看看MFC是怎么解决这个问题的。
当是聚合的情况时,有两种情况:
1。客户有外部组件的pUnknown,他要求内部组件的接口
外部组件得到内部组件的pUnknown并用他来QUERYINTERFACE
至于他是怎么得到内部组件的pUnknown,可看看MFC。
(其实就是在CoCreateInstance时获取)
2。客户有内部组件的pUnknown,他要求外部组件的接口
因为这个内部组件支持聚合,所以他维护着一个外部指针pOut,
指向外部组件。
CB::QUERYINTERFACE()
{
if (pOut != NULL)
return pOut->QUERYINTERFACE();
return QUERYINTERFACE();
}
回复
fkuk 2002-04-07
你的疑虑是完全正确的,佩服。
解决的办法参看 《COM 本质论》159~165 页,内容太多,不然就给你打出来,总的意思是维护两个 vtbl,一个用于内部,相关的函数为 InternalQueryInterface 等,另一个用于外部,相关的函数为 QueryInterface 等。对你的例子,若 CA 要 CB 的 IY,则 CA 应该调用CB.InternalQueryInterface,这时会给 CA 返回给正确的 IY 接口,而若是外部要访问 CB 的 IY,它将调用 CB.QueryInterface,此时 CB 会将请求转发给 CA。
回复
arxing 2002-04-06
m_punknowinner是用CoCreateInstance()创建的非委派接口,m_punknowinner->Queryinterface()直接或的内部组件的委派接口。请注意,前面是非委派接口,由INoAggregationUnknwon派生,后面是委派接口,由IUnknown派生。
回复
相关推荐
发帖
ATL
创建于2007-09-28

3214

社区成员

ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
申请成为版主
帖子事件
创建了帖子
2002-04-06 01:02
社区公告
暂无公告