计算机应用 | 古代文学 | 市场营销 | 生命科学 | 交通物流 | 财务管理 | 历史学 | 毕业 | 哲学 | 政治 | 财税 | 经济 | 金融 | 审计 | 法学 | 护理学 | 国际经济与贸易
计算机软件 | 新闻传播 | 电子商务 | 土木工程 | 临床医学 | 旅游管理 | 建筑学 | 文学 | 化学 | 数学 | 物理 | 地理 | 理工 | 生命 | 文化 | 企业管理 | 电子信息工程
计算机网络 | 语言文学 | 信息安全 | 工程力学 | 工商管理 | 经济管理 | 计算机 | 机电 | 材料 | 医学 | 药学 | 会计 | 硕士 | 法律 | MBA
现当代文学 | 英美文学 | 通讯工程 | 网络工程 | 行政管理 | 公共管理 | 自动化 | 艺术 | 音乐 | 舞蹈 | 美术 | 本科 | 教育 | 英语 |

C++类的动态组件化技术

2013-10-19 01:11
导读:计算机应用论文论文,C++类的动态组件化技术在线阅读,教你怎么写,格式什么样,科教论文网提供各种参考范例:   关键词:COM组件 接口 生命周期 

  关键词:COM组件 接口 生命周期 C++类 ATL组件类 C++基类 ATL模板基类 继承

  论文摘要:在组件化编程的时代,如何复用累积的大量没有组件特性的C++类?本文从工程的角度对这一问题进行探讨,利用现有组件技术,提出了一套将C++类平滑过渡到COM组件的完整解决方案。

  1. 问题的提出

  自从Microsoft公布了COM(Component Object Model,组件对象模型,简称COM)技术以后,Windows平台上的开发模式发生了巨大的变化,以COM为基础的一系列组件技术将Windows编程带入了组件化时代,传统的面向对象的软件开发方法已经逐渐被面向组件的方法所取代。

  COM标准建立在二进制可执行代码级的基础上,不论何种工具、开发的组件,只要符合COM规范,就可复用于VC、VB、Delphi、BC等各种开发中。COM的语言无关性将软件复用的层次从源代码级推进到了二进制级,复用更方便,也更安全。

  然而,COM技术带来全新的软件设计和开发模式的同时,也带来了新的问题。

  许多软件公司在开发自己的软件产品过程中,都累积了大量C++类,这些代码设计精良,功能完备,以面向对象的标准来无可挑剔。然而,这些代码不支持COM,将无法在COM时代继续被复用。如果它们在软件组件化的趋势中被淘汰,那对软件公司和开发人员来说都是极大的损失。

  COM专家Don Box曾说过,“COM is a super C++”。这给了我们一个启示,是否可以实现一种技术,能够动态的为普通C++类加上一层COM的封装呢?这样,既可以保持这些代码自身的完整和特性,使它们能继续应用于原来的系统,也可以在需要作为组件使用的时候,把它们动态转变成组件,复用于新系统。

  一个自然而然的想法是,为每一个C++类开发一个只暴露一个接口的COM组件,将原C++类的每个public方法都对应于该接口的一个方法,接口方法的实现可以简单的调用相对应的C++类方法即可。这样,程序由原有的C++类控制,但COM层的封装则由组件提供。基本思路如下图所示:

  

  本文就这一技术展开讨论,最终提供一套由普通C++类平滑过渡到COM组件的完整解决方案。我们选用ATL(Active Template Library,活动模板库,简称ATL)作为COM组件的开发工具,开发环境为Visual Studio 6.0。如没有特殊说明,下文中的“C++类”指没有组件特性C++类,“C++对象”指C++类的实例;“ATL组件类”指用于包装的ATL类,“ATL对象”指ATL组件类的实例。

  2. 用ATL包装C++类

  按上述思路将C++对象动态组件化后,所得的组件实际上由两部分组成:ATL组件对象和绑定的C++对象。两者的生命周期互相牵制,但要保持一致。生命周期的是C++类动态组件化的首要难点。

  C++类分为两种,一种是简单的C++类,一种是集合型的C++类。集合型的C++对象管理一组C++对象,负责其创建和删除,维护它们的生命周期。下面,分别就简单C++类和集合型C++类的组件化技术进行说明,展示解决方案的核心技术。

  2.1. 简单C++类的组件化

  为使ATL组件类可以自由调用C++类的方法,需要:

  l 为ATL组件类安插一个指针成员变量,指向C++类

  l 提供ATL对象和C++对象的绑定机制

  我们可以在ATL组件类初始化时创建一个C++类,用成员变量m_pCPPObj记录,在析构时删除,从而实现ATL组件类和C++类的天然绑定。但出于灵活性考虑,使得ATL组件对象可以绑定任意C++类的对象,我们为ATL组件类添加一个绑定函数Link2CPPObj(CImplement* pObj)。

  在ATL组件类的构造函数内,创建一个C++对象,用m_pCPPObj记录。

  如果调用了Link2CPPObj,则将m_pCPPObj指向的对象删除,改用传入的C++对象。

  在ATL组件类的的析构函数内,删除其绑定的C++对象。由构造函数和Link2CPPObj函数的定义可知,m_pCPPObj指针总是有意义的。

上一篇:家庭自动化系统 下一篇:没有了