欢迎来到天天文库
浏览记录
ID:14368771
大小:41.60 KB
页数:31页
时间:2018-07-28
《c 类的动态组件化技术》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、C++类的动态组件化技术论文关键词:COM组件接口生命周期C++类ATL组件类C++基类ATL模板基类继承论文摘要:在组件化编程的时代,如何复用历史累积的大量没有组件特性的C++类?本文从工程的角度对这一问题进行探讨,利用现有组件技术,提出了一套将C++类平滑过渡到COM组件的完整解决方案。1.问题的提出自从Microsoft公布了COM技术以后,Windows平台上的开发模式发生了巨大的变化,以COM为基础的一系列诋组件技术将Windowsル编程带入了组件化时代,传统的面向对象的软件开发方尿法已经逐渐被面
2、向组件的方法所取代。编辑。COMT标准建立在二进制可执行代镙码级的基础上,不论何种工玟具、语言开发的组件,只要》符合COM规范,就可复用查于VC、VB、Delph┎i、BC等各种开发环境中孑。COM的语言无关性将软件复用的层次从源代码级推进到了二进制级,复用更方便,也更安全。然而,C鳎OM技术带来全新的软件设票计和开发模式的同时,也带昀来了新的问题。许多软件跖公司在开发自己的软件产品31/31过程中,都累积了大量C+┊+类,这些代码设计精良,骂功能完备,以面向对象的标屡准来检验无可挑剔。然而,簦这些
3、代码不支持COM,将骊无法在COM时代继续被复用。如果它们在软件组件化服的趋势中被淘汰,那对软件公司和开发人员来说都是极社大的损失。COM专家D纠onBox曾说过,“CO蹇MisasuperC++然”。这给了我们一个启示,瓦是否可以实现一种技术,能ソ够动态的为普通C++类加梆上一层COM的封装呢?这龠样,既可以保持这些代码自杳身的完整和特性,使它们能U继续应用于原来的系统,也镛可以在需要作为组件使用的时候,把它们动态转变成组詈件,复用于新系统。一个顿自然而然的想法是,为每一魁个C++类开发一个只暴露一
4、个接口的COM组件,将逊原C++类的每个publ强ic方法都对应于该接口的罹一个方法,接口方法的实现可以简单的调用相对应的Cf++类方法即可。这样,程≥序逻辑由原有的C++类控制,但COM层的封装则由组件提供。基本思路如下图臃所示:本文就这一技术展祺开讨论,最终提供一套由普臊通C++类平滑过渡到CO黢M组件的完整解决方案。我搀们选用ATL作为COM组啮件的开发工具,开发环境为屉VisualStudio泯。如没有特殊说明,下文中箴的“C++类”指没有组件廾特性C++类,“C++对蕺象”指C++类的实例;“
5、钵ATL组件类”指用于包装蒌的ATL类,“ATL对象恶”指ATL组件类的实例。31/312.用ATL包装C++类按上述思路将C++对象动栗态组件化后,所得的组件实际上由两部分组成:ATL组件对象和绑定的C++对弛象。两者的生命周期互相牵坶制,但要保持一致。生命周栎期的管理是C++类动态组_件化的首要难点。C++焐类分为两种,一种是简单的C++类,一种是集合型的录C++类。集合型的C++┲对象管理一组C++对象,碰负责其创建和删除,维护它栖们的生命周期。下面,分别瀹就简单C++类和集合型C畴++类的组件化
6、技术进行说眠明,展示解决方案的核心技毋术。简单C++类的组件压化为使ATL组件类可以肃自由调用C++类的方法,音需要:l为ATL组件类安插一个指针成员变量,指慌向C++类l提供ATL增对象和C++对象的绑定机演制我们可以在ATL组件去类初始化时创建一个C++あ类,用成员变量m_pCP榧PObj记录,在析构时删Ν除,从而实现ATL组件类和C++类的天然绑定。但球出于灵活性考虑,使得AT笱L组件对象可以绑定任意C袢++类的对象,我们为ATL组件类添加一个绑定函数锰Link2CPPObj。在ATL组件类的构造
7、函数野内,创建一个C++对象,谀31/31用m_pCPPObj记录罘。如果调用了Link2婢CPPObj,则将m_p琴CPPObj指向的对象删棚除,改用传入的C++对象庑。在ATL组件类的的析沲构函数内,删除其绑定的C嗤++对象。由构造函数和Link2CPPObj函数例的定义可知,m_pCPPObj指针总是有意义的。简单C++类组件化的思想炎如下图所示:集合型C+帔+类的组件化集合型C+肘+类的情况有所不同。集汝合型C++类以数组、列表、映射表的形式管理其它C蹀++对象。集合对象和它管晰理的元素对象都被
8、包装成组陬件后,集合型ATL对象可罅能调用一个“Destro彤y”方法,期望删除某一个脑元素ATL对象;这一操作齑的实质却是,集合型C++对象的“Destroy”ぼ方法被调用,将元素C++额对象删除了,而元素ATL陇对象却不知道。这一操作的侨结果导致了元素的ATL对熵象存在,而其绑定的C++憷对象却被删除的情况,两者雪的生命周期出现了不一致。为了解决这个问题,我们需蚬要在C++对象被删除时,路能将
此文档下载收益归作者所有