CComContainedObject是怎么回事呀?

aspnetwuxueyou 2004-01-13 05:46:50
我都糊涂了,
CComContainedObject implements IUnknown by delegating to the owner object's IUnknown. (The owner is either the outer object of an aggregation, or the object for which a tear-off interface is being created.) 这是什么意思呀?
CComContainedObject不是指向被聚集的对象吗?它和代理IUnknown和非代理IUnknown什么关系呀?

麻烦老大们给解释一下,别告诉我那些链接,我看了好多链接了,没看懂:(
...全文
172 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Longitude 2004-01-14
  • 打赏
  • 举报
回复
关注
aspnetwuxueyou 2004-01-14
  • 打赏
  • 举报
回复
up
aspnetwuxueyou 2004-01-14
  • 打赏
  • 举报
回复
thanks
lop5712 2004-01-14
  • 打赏
  • 举报
回复
当生成CC的实例时,总共将生成两个对象——CComAggObject的实例和CComContainedObject的实例,而后者是前者的成员变量(实际应该说后者是前者的一部分)。所以CComAggObject的实例和CComContainedObject的实例是一体的。CComAggObject对外就代表着CC,但实际的CC是由CComContainedObject实现的,引用记数是CComAggObject的引用记数,而CComContainedObject的实例并不具备引用记数,因为它一定会被聚合在外部对象内部,所以对它的生命期的控制(即IUnknown的那三个函数)都委派给外部对象,这是聚合的要求。

当外部对象创建CC时,通过CoCreateInstance获得的IUnknown*是CComAggObject的实例,通过调用AddRef添加的是CComAggObject的引用记数(也同样是CComContainedObject的引用记数),但是客户通过QueryInterface得到的IA接口,调用AddRef添加的却是外部对象的引用记数,因为IA是CComContainedObject实现的,而这正是聚合所要求的。
aspnetwuxueyou 2004-01-14
  • 打赏
  • 举报
回复
to lop5712(LOP):
而CComAggObject仅仅简单的将它再传递给CComContainedObject实例,而CComAggObject自己依然保持着其引用记数(因为 union { long m_dwRef; IUnknown* m_pOuterUnknown; };)。
CComAggObj保持的是谁的计数???
lop5712 2004-01-14
  • 打赏
  • 举报
回复
前面的 zhangcrony(前后都是路,橫豎都是一) 已经把那句话翻译了,所谓的“delegating”指CComContainedObject自己不实现IUnknown的具体细节,而通过简单的调用所有者的IUnknown实现来实现IUnknown。下面就ATL实现可聚合组件的方式来说明CComContainedObject的用处。

假设楼主自己编写的类CC实现了接口IA,但是类CC并没有实现IUnknown的三个函数(如果使用向导生成的,最基本地只派生自CComObjectRootEx和CComCoClass),它们一般是由CComObject实现的。
当外部对象的IUnknown*通过CoCreateInstance传给组件时,由于CC支持被聚合,因此类厂通过CComAggObject< CC >的形式创建了一个类CComAggObject的实例(注意,CC的实例并没有被创建,而CComAggObject是一个和CComObject一样的实现了IUnknown的那三个函数的类),此实例具有自己的引用记数且只实现IUnknown。
而CC的实例是通过CComAggObject的一个成员变量生成的(由于CC的实例是CComAggObject的成员变量而在CComAggObject实例生成时自动由CComAggObject的构造函数完成生成),此成员变量的类型是CComContainedObject,它是CC的派生类(通过如此的形式:template< class U > class CComCotainedObject : public U;),它和CComObject及CComAggObject一样,都是只实现了IUnknown的三个函数,其他什么都没做。
当CComAggObject构造时,外部对象的指针pUnkOuter通过其构造函数的参数传给CComAggObject的实例,而CComAggObject仅仅简单的将它再传递给CComContainedObject实例,而CComAggObject自己依然保持着其引用记数(因为 union { long m_dwRef; IUnknown* m_pOuterUnknown; };)。
因此通过外部对象暴露给客户的IA接口实际是指向CComContainedObject的实例,由于是被聚合的,所以对IA的AddRef等调用必须委派给pUnkOuter,所以CComContainedObject的IUnknown的三个实现都是将调用委派给外部对象,因为它是IA接口的实现者。

对于tear-off也有类似的情况,所以其也被应用在CComCachedTearOffObject中
aspnetwuxueyou 2004-01-14
  • 打赏
  • 举报
回复
up
zhangcrony 2004-01-13
  • 打赏
  • 举报
回复
CComContainedObject類通過指派所有者對象的IUnknown來實現IUnknown. (所有者要么是一個外部集合的外部對象﹐要么是那些為了創建 tear-off接口而有的對象。)
aspnetwuxueyou 2004-01-13
  • 打赏
  • 举报
回复
up
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧