(计算机应用技术专业论文)com组件化程序设计方法研究.pdf_第1页
(计算机应用技术专业论文)com组件化程序设计方法研究.pdf_第2页
(计算机应用技术专业论文)com组件化程序设计方法研究.pdf_第3页
(计算机应用技术专业论文)com组件化程序设计方法研究.pdf_第4页
(计算机应用技术专业论文)com组件化程序设计方法研究.pdf_第5页
已阅读5页,还剩60页未读 继续免费阅读

(计算机应用技术专业论文)com组件化程序设计方法研究.pdf.pdf 免费下载

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

哈尔滨_ 稃大学硕十学何论文 摘要 在计算机软件发展的早期,一个应用系统往往是一个单独的应用程序。应 用越复杂,程序就越庞大,系统开发的难度就越大,从而,版本更新周期也越 长。为了解决软件复用,缩短软件开发时间,降低维护成本和实现程序动态升级, 一种新的软件模型鲴件化程序设计结构产生了。微软的c 删组件对象模型 是当今比较成熟的软件组件技术之一,被广泛应用于其操作系统和应用程序中。 在分布式计算、i n t e r n e t 网络、三层体系结构开发以及音视频处理等前沿领域, c o t 4 组件技术也正在被大量使用和完善。 为了能够深入地理解c o m 组件化程序设计的思想,更好地应用其进行c 叫 应用程序的开发。论文首先对其底层实现机制进行了深入而系统的研究和讲解。 在阐述了软件组件概念、内容和意义的基础上,重点说明了c 0 l l 组件模型和c o m 组件的底层实现细节并对c 伽组件复用模型加以改进和优化。接着,对c 叫的 扩民o 叫+ 技术进行了介绍。 最后本文给出了一个基于c o m 的花样滑冰评判系统的应用实例,并将改进 的c o m 组件复用模型应用其中,使该系统更灵活、更易于升级维护充分体现 了c o m 组件化设计思想的优越性。 关键词:组件;组件对象模型;接口;d i r e c t x ;g i r e c t s h o w a b s t r a c t i nt h ee a r l yt i m e so fc o m p u t e rs o f t e w a r ed e v e l o p m e n t ,a na p p l i c a t i o n i su s u a l l yas i n g l ea p p l i c a t i o n t h em o r ec o m p l e xt h ea p p l i c a t i o ni s , t h el a r g e rt h ep r o g r 鲫i s ,a n dt h eh a r d e rt h es y s t e mi sd e v e l o p e d f u r t h e r m o r e ,t h eu p d a t ep e r i o do fv e r s i o ni sl o n g e r i no r d e rt or e s o l v e t h es o f t w a r er e u s e ,s h o r t e nt h es o f t w a r ep r o g r a m m i n g rr e d u c et h e m a i n t e n a n c ec o s t ,a n di m p l e m e n td y n a m i cu p d a t eo fa p p l i c a t i o n ,an e w s o f t w a r em o d e l - - c o m p o n e n ts o f t w a r es t r u c t u r ec o l so u t n o w a d a y s , c o m p o n e n to b j e c tm o d e l ( c o m ) f r o mt h ec o r p o r a t i o no fm i c r o s o f ti so n e o ft h e l a t u r es o f t w a r ec o m p o n e n tt e c h n o l o g i e sa n dw i d e l ya p p l i e di ni t s o p e r a t i o ns y s t e ma n da p p l i c a t i o ns o f t v r a r e s i nt h ea r e a so fd i s t r i b u t e d c o m p u t a t i o n , i n t e r n e t , b s s t r u c t u r e d e v e l o p m e n t , a u d i o - v e d i o p r o c e s s i n g , a n ds oo n ,c o gt e c h n o l o g yi sa l s ou s e dl a r g e l ya n dp e r f e c t e d i no r d e rt ou n d e r s t a n dt h e0 洲t h o u g h td e e p l y u s ei tt od e v e l o po 删 a p p l i c a t i o n sb e t t e r ,t h et h e s i sm a k e sad e e pa n ds y s t e m i cr e s e r c ha n d e x p l a i no ft h ei n f r a s t r u c t u r em e c h a n i o fc o m b a s e do nt h ec o n c e p t i o n s c o n t e n t ,s i g n i f i c a n c eo fs o f t w a r ec o m p o n e n t ,t h et h e s i se l a b o r a t e st h e c 删m o d e la n dt h eb o t t o mi m p l e m e n t a t i o nd e t a i l so fc 叫。a n di m p r o v e dt h e c o mr e s u s em o d e l t h e n t h et h e s i si n t r o d u c e st h ec 例e x t e n s i o n 删+ f i n a l l y ,t h et h e s i ss u p p l i e sa na p p l i c a t i o n - - t h ej u d g i n gs y s t e mo f f i g u r es k a t i n gb a s e o nc o m t h ei m p r o v e dc o mr e u s em o d e lw a sa p p l i e di n t h es y s t e m , w h i c hm a k e si tm o r ef l e x i b l e s o i tc o n t r i b u t e st ot h eu p d a t e m a i n t a n e n c ei nt h ef u t u r ea n dc o m p l e t e l ye m b o d i e st h es u p e r i o r i t i e so f t h ed e s i g ni d e ao fc 例 k e yw o r d s :c o m p o n e n t ;c o m p o n e n to b j e c t d e l : i n t e r f a c e =d i r e c t x = d i r e c t s h o w 哈尔滨工程大学 学位论文原创性声明 本人郑重声明:本论文的所有工作,是在导师的指导 下,由作者本人独立完成的。有关观点、方法、数据和文 献的引用已在文中指出,并与参考文献相对应。除文中已 注明引用的内容外,本论文不包含任何其他个人或集体已 经公开发表的作品成果。对本文的研究做出重要贡献的个 人和集体,均已在文中以明确方式标明。本人完全意识到 本声明的法律结果由本人承担。 作者( 签字) :查:2 盈 日期:易砷年月7 导日 第1 章绪论 自从1 9 4 6 年第一台计算机诞生以来,软件开发技术就在不断地发展中, 从早期的机器语言,汇编语言程序设计到面向过程和面向对象技术的程序设计, 软件开发技术的每一步前进无不围绕着提高软件可重用性、降低软件开发风险、 提高开发效率而进行的。随着软件规模的扩大,如何缩短软件开发周期、降低 风险,使得基于组件的程序设计思想扮演了重要的角色,c 侧思想就是其中一 个杰出的代表。 i 1 课题研究的目的和意义 将c o m 说成是w i n d o w s 平台下最重要的技术毫不为过,各类系统及应用软 件几乎都用到了它,如:h c t i v e x 、d i r e c t x 、o l e 以及w i n d o w sm e d i a “都是以 c o m 作为基础的,笔者在w i n d o w s 平台上开发时经常与之打交道。o 叫本身是一 门相对复杂的技术,其中涉及到了很多难以理解的细节问题,因此掌握它需要 很长的一段时间。但对于w i n d o w s 平台开发人员来说理解并熟悉c 伽是必要的, 最终能够运用c 例进行软件开发。如今从事纯桌面应用开发已经很少,分布式 应用逐渐成为主流,是软件技术发展的必然趋势,m i c r o s o f t 的d c o m 和m t s c o m + 正是为了适应这一趋势而发展起来的。c o m + 已经成为w i n d o w s 平台下开发分布 式多层应用必不可少的技术。虽然微软以后将逐步向n e t 过渡,但是c 例在短 时间内是不可能消失的。某些软件必须采用c o m 组件才能很好的满足要求,原 有的基于c 0 i 的应用程序将继续使用,甚至可以扩展,已经成熟的c 咖不会被 遗弃,相当长时问内仍是w i n d o w s 平台下开发分布式多层应用的首选,n e t 也 通过互操作技术支持m r s c o m + 。 c 伽是开发软件组件的一种方法。组件实际上是一些小的二进制可执行程 序,它可以给应用程序、操作系统以及其它组件提供一些服务。开发定制的c 咖 组件就如同开发动态的、面向对象的a p i 。多个c o m 对象可以连接起来以形成 应用程序或组件系统。并且组件可以在运行时、在不重新链接或编译应用程序 的情况下被卸下或替换掉。因此,通过该课题的研究,掌握c o m 这门重要的技 哈尔滨r 程人学硕十学位论文 术具有以下儿个重要意义: 1 ) 对于那些w i n d o w s 的开发人员来说,可以更好掌握和理解a c t i v e x 、o l e 、 1 ) i r e c t x 等应用技术; 2 ) 由于使用其开发的组件具有可重用性,所以对于降低软件开发风险, 提高软件开发效率具有重要意义; 3 ) 由于其是基于二进制的程序,具有语言无关性。所以对于那些已经成 型的软件不必重新编译整个程序,只需对那些需要更新或需要修改的组件进行 替代即可,从而节省了维护时间与成本; 4 ) 由于c o m 是使用组件来向客户程序提供服务的,这样在开发一个软件 系统时有利于模块功能的划分和人员的分工,这对于开发大型系统来说至关 重要; 5 ) 不同的组件标准本质上是相通的,掌握了c 嘣有助于理解其它的组件 技术,有助于提出新的组件模型标准。 1 2c o m 组件研究现状 软件组件化。“”( s o f t w a r ec o m p o n e n t ) 技术是在大工业生产启发下应运 而生的,是软件技术跨世纪的一个发展趋势,其目的是彻底改变软件生产方式, 从根本上提高软件生产的效率和质量,提高开发大型软件系统尤其是商用系统 的成功率。有了软件组件之后,应用开发人员就可以利用现成的软件组件装配 成适用于不同领域,功能各异的应用软件。复用软件一直是整个世界软件业所 追求的梦想,软件组件化的实现这一梦想指出了一条切实可行的道路,而中间 件正是组件化的一种形式。中间件抽象了典型的应用模式,应用软件制造者可 以基于标准的形式进行开发,使软件组件化成为可能,加速了软件复用的进程。 因此,中间件是符合软件发展的内在规律的。 中闻件是软件技术发展的一种潮流,被誉为发展最快的软件品种,近年来 势头强劲。当然,这也是源于市场在全球范围内对中间件的支持。毫无疑问, 中问件正在成为软件行业新的技术和经济增长点。 c 伽是m i r o s o f t 提出的一种软件组件化标准,因此很多的产品和技术都是 基于该标准的。例如:a c t i v e x 、o l e 等技术都是以0 咖为基础的,当前一些非 2 常流行的技术也是基于该规范的,像用于网络的流媒体w i n d o w sm e d i a ,以及 更加具有潜力的v o i p 、i p t v 等技术都是以c o n 为基础的。 1 3 论文主要内容和主要工作 本文主要研究内容及相关工作包括: 首先,本文对课题研究的目的和意义进行的详细的阐述,进而给出了c o g 组件的研究现状。 其次,论文对软件组件思想进行总体的介绍,阐述了软件组件技术的产生 与发展,并给出其与以往软件开发方法相比具有的优点与软件组件的实现条件。 随之对软件组件技术_ c 伽思想进行了更加详细的研究,介绍了c 伽的基本 概念、基本原理及相关技术,在此基础上使用c + + 对c 例组件进行了实现并对 c o m 组件复用模型加以改进和优化,使其更加适用于具体的实际。然后,对c o g 的发展d c 伽、c o g + 进行了全面的介绍。 最后,本文给出了一个基于c o g 的花样滑冰评判系统,详细介绍了系统的 整体结构,并且详细介绍了系统中关键技术的设计与实现。 1 4 论文的组织结构 本论文主体共分为四章,按如下方式组织: 第1 章是本论文的绪论部分,介绍了本论文研究的目的与意义、c o g 组件 的研究现状、本论文研究的主要内容和工作,并对论文的组织结构进行了说明 第2 章简要介绍了软件组件,整体介绍了软件组件的产生、优点和实现条 件,并详细介绍了c o m 模型的原理、实现方式、c 0 m 组件、c o g 接口以及c o m 组件复用并结合实际加以改进优化。 第3 章介绍了c 嗍的发展o o m + ,给出c 0 i i + 的基本结构、主要特性和新 增的功能。 第4 章给出了一个基于c o n 的花样滑冰评判系统实例,对其中一些技术要 点进行的详细的介绍并将改进型的c o m 组件复用模型应用到该系统实例当中, 使系统更具有灵活性,更易于维护。 第2 章软件组件与c o m 模型 2 1 软件组件概论 软件组件技术是解决软件复用“,缩短软件编写时间,降低维护成本和实 现程序动态升级的最新和强有力的方案,在整个软件工业界中得到了迅速应用。 2 1 1 软件组件的产生 一个应用程序通常是由单个的二进制文件组成的。当编译器生成此应用程 序之后,在对下一个版本重新编译并发行新生成的版本之前,应用程序一般不 会发生任何变化。操作系统、硬件及客户需求的改变都必须等到整个应用程序 被重新编译之后才能够得以认可。整个软件工业就这样随着已发行软件的日益 老化而奔向未来。 目前这种状况已经发生了变化。人们认识到应用程序在发行之后不应该保 持那种静止的状态。开发人员应找出一种方法,以能够给已经发行的软件不断 地注入新的活力。这种解决方案就是将单个的应用程序分隔成多个独立的部分, 也即组件。 这种做法的好处是可以随着技术的不断发展而用新的组件取代已有的组 件。此时的应用程序将不再像以前那样是一个在发行之前就已命中注定要过时 的静态实体,而是可以随着新组件不断取代旧的组件而趋于完善。并且从已有 的组件可以建立全新的应用程序。 传统的做法是将应用程序分割成文件、模块或类,然后将他们编译并链接 成一个“铁板”块状的应用程序。它与组件建立应用程序的过程有很大的不同 一个组件同一个微型应用程序类似,即都是已编译、链接好并可以使用的了, 应用程序就是由多个这样的组件打包而得到的。各定制的组件可以在运行时同 其它组件连接起来以构成某个应用程序。在需要对应用程序进行修改或改进时, 只需将构成此应用程序的组件中的某个组件用新的版本替换即可。 2 1 2 软件组件模型 组件是指能够容易地组装起来,以更高的开发效率创建应用程序的可复用 4 哈向 滨i + 稃人学碗+ 学位论文 软件部分。组件技术的核心是组件模型,它定义了组件的结构、外部如何操作 组件以及组件问的相互作用。组件和容器是组件模型的两种基本元素。组件部 分提供了创建实际组件的模板,是组件创建与利用的基础。容器部分定义了将 组件集中起来成为有用结构的方法,提供了安排组件及与其他组件相互作用的 语言环境。组件模型还负责提供各种形式的服务。功能完善的组件模型可支持 下列六种主要服务: 1 ) 自我描述 自我描述是指向外界展示组件功能的机制。通过自我描述机制,应用程序 能够对组件提出询问,找到组件的功能并且与组件相互作用。自我描述是组件 模型的关键特征之一,负责决定组件对应用程序以及其他组件的外观。 2 ) 事件处理 事件处理是一种能够使组件产生事件通知的机制。这种通知与组件内部状 态的变化相对应。通知的对象或者是父应用程序或者是其他组件。 3 ) 持久性 持久性是指在永久性的存储介质( 如硬盘) 上存储和获取组件的方式。存储 和获取的信息是组件的内部状态以及它与容器或其他组件的关系。 4 ) 布局 布局是指可视化组件的物理布局,包括组件自己空间内的组件布局和在同 一个容器内与其他组件共享空间的布局。组件的空间需求主要是给组件提供一 个矩形区域以使组件成为可视的。 5 ) 对应用程序建立器”1 的支持 组件对应用程序建立器的支持,使用户能以图形方式在组件外建立复杂的 应用程序。通常应用程序建立器的支持由对话框组成,使用户能以图形界面的 方式来编辑组件的属性。 6 ) 对分布式计算的支持 随着网络技术和应用的发展,组件模型对分布式计算的支持变得越来越重 要。软件组件模型可以简化分布式应用程序的开发过程。 2 1 3 软件组件技术的优点 软件组件技术将应用程序分割成小的可复用的组件,在运行时将这些组件 哈尔滨i :程人学项十学位论文 组装起来形成所需的应用程序。每一个组件都可以在不影响其他组件的情况下 被升级,这使得应用程序可以随时向前发展进化。应用组件技术还可以在应用 程序定制、组件库。”及分布式组件等方面获益。图2 1 示意了应用程序定制的 含义 用户l用户2 图2 1 应用程序定制 组件架构是可以被定制的,用户可以根据需要将某个组件替换掉。在图2 1 中,假定某些组件是基于编辑器n o t e p a d 和w o r d 的,用户1 将应用程序配置成 为使用n o t e p a d ,而用户2 更喜欢使用w o r d 。按照此种方式,可以加入新的组 件或改变已有组件而方便地定制应用程序。 组件库应用程序 组件i组件a组件b l 组件2 f 组件2 i 组件3定制组件l 组件4定制组件2 圈2 ,2 从组件库中提取组件来定制应用程序 组件架构最引人注目的优点之一是快速应用程序开发。这一优点可以使 开发人员从某个组件库中取出所需要的组件并将其快速地组装到一起以构成应 用程序。如图2 2 所示。在将已有应用程序转化成分布式应用程序时,若程序 是由组件组装成的,转化过程将会简单得多。首先,应用程序己经被划分成可 6 哈尔滨下稗大学硕十学位论文 以位于远地的各个功能部分;其次,由于任一组件均是可以被替换的,因此可 以将某个组件替换成专门负责同远程机上的组件通信的组件。 在图2 3 中,组件c 和组件d 被放到了网络远程机器上。在本地,它们被 替换成了两个新的组件:组件c l 和d l 。这两个新的组件的作用是将其他组件 发来的请求通过网络转发给组件c 和组件d 。本地机器上的应用程序并不需要 知道实际所用到的组件到底在何处。类似的,远地组件也不需要知道它们是否 位于远地。这样通过加入合适的远地组件,应用程序完全不需要知道实际的组 件到底在哪里。 本地机器 远程机器1 网络” 图2 3 使用了远程组件的应用程序 2 i 4 软件组件实现条件 使用组件的种种优点直接来源于可以动态地将它们插入或卸出应用程序。 为了实现这种功能,所有的组件必须满足两个互相依赖的条件。 1 ) 动态链接 通过动态链接,用户可以在运行时将组件替换掉,而开发人员不需要将蕉 个程序重新编译或链接一遍后重新发行新的版本。 2 ) 信息封装 应用程序是由各个组件连接起来的当用新的组件把某个组件替换掉时, 需要将此组件同系统断开,然后将新的组件连上去。显然新的组件必须按同样 的方式连接到系统中,否则将需要重新编写、重新编译或重新链接这些组件。 对于一个应用程序或组件,如果它使用了其他组件,费们称之为一个客户,客 7 徊画徊询 哈尔滨i :秤人学硕+ 学位论文 户通过接口同其他组件进行连接。如果某个组件发生了变化,而其接口没有任 何改变,那么它的客户将不需要进行任何修改。类似地,若客户发生了变化, 而没有改变其接口,那么它所连接的组件也不需要任何改变。相反,如果客户 或组件的变化导致了对接口的修改,那么接口的另一方也应发生相应的变化。 因此为了充分发挥动态链接的功能,组件及客户都应尽可能不要改变它们的接 口,即它们必须封装起来。也就是晚,组件及客户的内部实现细节不能反映到 接口。接口同内部实现细节的隔离程度越高,组件或客户发生变化时对接口的 影响将越小。这种将客户同组件实现隔离的要求对组件加上了如下的限制: ( 1 ) 组件必须将实现其所用的编程语言封装起来。编程语言的暴露将会 在组件和客户问引入新的依赖。 ( 2 ) 组件必须以编译、链接好的可执行代码的形式发布。 ( 3 ) 组件必须可以在不妨碍已有用户的情况下被升级。 ( 4 ) 组件在网络上的位置必须可以透明地被重新分配。组件及使用它的 程序应能够在同一进程中、不同进程中或不同机器上运行。客户对远程组件的 处理方式应与对本地组件的处理方式是一样的。 2 2c o m 接口与c o m 库 2 2 1c 0 m 的产生 组件对象模型“”“( c o m p o n e n to b j e c tm o d e i ,c o m ) 是微软公司于 1 9 9 3 年创建的。现在是微软公司、数据设备公司( d e c ) 等公司所支持的一种 软件组件结构标准。开发c o l i 的目的是为了使应用程序更易于定制、更为灵活。 最初目标是为对象链接与嵌入“”( o l e ) 提供支持。c o m 提供了创建兼容对象的 技术规范,以及运转它所需的w i n d o w s 操作系统进程问通信( i n t e r p r o c e s s c 衄即a u n i c a t i o i l ,i p c ) 规范。 c o m 规范是一套为组件架构设置标准的文档,提供了一种编写与语言无关 的能够按面向对象a p i 形式提供服务的组件的方法。c o m 具有一个被称作c 咖 库的a p i ,它提供了对所有客户及组件都非常有用的组件管理服务。o 洲库可以 保证对所有组件的大多数重要的操作都可以按相同的方式完成。c o p 4 库中的大 多数代码均可以支持分布式或网络化的组件。w i n d o w s 系统上分布式d c 叫 8 哈尔滨下稃人学硕十学能论文 ( d i s t r i b u t e dc o m p o n e n to b j e c tm o d e l 。d c o m ) 的实现中提供了一些同网络 上其他组件通信所需的代码。c o h 组件是以w i n 3 2 动态链接库( d l l s ,o c x s ) 或可执行文件( e x e s ) 的形式发布的可执行代码。遵循c 0 m 规范编写的组件将 能够满足对组件架构的需求。 2 2 2c 0 m 接口 接口提供了两个不同对象之间的一种连接。对由c o m 组件构成的应用程序 而言,接【:_ | 比实现接口的组件更重要。使用组件来构造应用程序的最大的优点 在于可以复用应用程序的结构。如果接口设计得好,可以得到可复用极高的结 构。c 删接口可以保护系统免受外界变化的影响;接口还可以使客户用同样的 方式来处理不同的组件,这种能力称为接口的多态。 1 ) o 删接口的内存结构 c o m 接口是包含一个函数指针数组和一个指向这个数组的指针的内存结 构。在c 语言中可以通过使用结构类型来构造c o h 接口所要求的内存结构。用 c + + 的纯抽象基类“。来实现c o m 接口更自然、方便。纯抽象基类是指仅包含纯抽 象函数的基类。纯抽象函数是用= o 标记的虚拟函数。在纯抽象基类中是不能实 现这些纯抽象函数的,因此接口只定义功能但并不定义具体的实现。一个c 侧 组件可以实现任意数目的接口,这可以通过对抽象基类的多重继承或使用嵌套 类等方式实现。为了实现组件的自我描述和控制自身的生存时间,c o m 规定所 有的c o m 组件必须实现一个名为i u n k n o * n 的接口。这个接口是访问c o m 组件中 其他接口的起点。i u n k n o w n 的定义包含在w i n 3 2s d k 中的u n k n 州h 中,为清 楚起见,引用如下: # d e f i n ei n t e r f a c es t r u c t i n t e r f a c ei u n k n o w n v i r t u r a lh r e s u l ts t d c a l lq u e r y i n t e r f a c e ( c e n s ti i d ii d 。v o i d * * p p v ) :o : v i r t u r a lu l o n gs t d c a l la d d r e f0 = 0 : v i r t u r a lu l o n gs t d c a l lr e l e a s eo = 0 ; : 9 哈尔滨一i :稃大学硕+ 学竹论文 在上面的定义中使用s t r u c t 定义接口i n t e r f a c e 这是因为在c + + 中 s t r u c t 关键字除了成员属性默认为p u c l i c 而不是p r i v a t e 外,等同于c l a s s 关键字。而接口是用来向外界公稚组件功能的,因此成员函数的属性应为 p u b l i c 。用一s t d c a l l 标记的函数将使用标准的调用约定,即这些函数将在返回 到调用者之前将参数从栈中删除。q u e r y i n t e r f a c e 是提供组件自我描述的关键 函数。客户可以通过此函数来查询某个组件是否支持某个特定的接口。若支持, q u e r y i n t e r f a c e 将返回一个指向此接口的指针,否则返回值将是一个错误代 码。传入参数i i d 是一个标识客户所需接口的“接口标识符”,输出参数p p v 存放查询到的接口的指针。返回值是一个h r e s u l t 类型,它是一个具有特定结 构的3 2 位值,不仅表示调用是否成功,而且在调用失败时,还包含出错原因的 代码。a d d r e f 和r e l e a s e 两个成员函数实现了一种名为引用计数的内存管理技 术,它们是使组件能够将自己最简单、最高效地删除的方法。c o m 组件将维护 一个称作引用计数的数值。当客户从组件取得一个接口时,此引用计数值将增 l ,当客户使用完某个接口后,组件的引用计数值将减1 。当引用计数值为0 时, 组件即可将自己从内存中删除。a d d r e f 用来增大引用计数值,而r e l e a s e 用来 减少这一值。图2 4 示意了i u n k n o w n 的内存结构。所有的c o m 接口都继承了 i u n k n o w n ,每个接口的v t b l 表的前三个函数都是q u e r y i n t e r f a c e a d d r e f 和 r e l e a s e ,使得所有的c o m 接口都可以被当成i u n k n o w n 接口来处理。并且c o m 组件的任何一个接口都可以被客户用来通过q u e r y i n t e r f a c e 函数获取它所支 持的其他接口。若某个接口的前三个函数不是这三个,那么它将不是一个0 0 m 接口。 客户程序 l u n k n o w ,k _ 、 。函数教组指针虚拟函数表 实现l u n k n o w n 的组件 图2 4i u n k n o w l l 接口的内存结构 哈尔滨1 稃人学硕十学位论文 所有的接口指针同时也是i u n k n o w n 指针,客户不需要单独维护一个代表 组件的指针,只需要关心接口的指针。下面是一个关于汽车的简单的c o m 接口 i c a r 的定义: i n t e r f a c ei c a r :i u n k n o v n v i r t u r a lv o i d s t d c a l lr u n ( u i n th o u r s ) = o ; v i r t u r a lf l o a ts t d c a l ls h o w k m ( ) 卸; ; i c a r 从c o m 的根接口i u n k n o m a 继承来,并实现了两个新函数r u n 和 s h o w k w 。r u n 是使汽车按参数h o u r s 指定的小时数行驶的函数;s h o w k _ l 用来显 示汽车行驶里程的函数。图2 5 示意了1 c a r 的内存结构。 客户程序 i c a r 实现l c a r 的组件 伍荔磊f 。l i 萧 i c 卅曹针卜jv t b l 撸 d l q u e f y i m 盯b q u e r y i n t e r f a c a d d r e fa d d m 姝e l i r a s *i k l e r u nr u n s h o w k m$ h o w k m 图2 5i c a r 接口的内存结构 2 ) c 伽接口的特性 ( 1 ) 接口不变性 c 例接口最大的特点是,一旦公布了一个接口,它将永远保持不变。升级 组件时,不会修改已有的接口,而是加入一些新的接口。在c 例中,用一个1 2 8 比特( 1 6 个字节) 的g u i d ( g l o b a l l yu n i q u e i d e n t i f i e r ,全局唯一标识符) 的 结构来标识一个接口,称为l i d ( i n t e r f a c ei d e n t i f i e r ) 。根据定义,g u i d 在时间和空间上都是唯一的,可以保证每个接口标识符都是唯一的。微软提供 1 1 哈尔滨r 稃大学硕+ 学忙论文 了两个产生g u i o 的程序:命令行方式的o l j l i i g e n e x e 和对话框方式的 g u i o g e n e x e 。另外,在微软的集成编程环境v i s u a ls t u d i o 中编写c o b l 组件时, 系统会自动生成g u i d ,并加入到源程序中。 当加入新的接口时,接口的l i d 值是不同的。例如,若想修改上面的i c a r 接口,以使在调用函数r u n 时,提供汽车的时速。但如果i c a r 接口已经公布出 去,则不能再修改i c a r 的定义,必须重新定义一个新的接口,如i c a r 2 : i n t e r f a c ei c a r 2 :i e n k n o w n i v i r t u r a lv o i ds t d c a l lr u n ( u i n th o u r s ,f l o a ts p e e d ) = o : v i r t u r a lf l o a ts t d c a l ls h o 非m ( ) :o ; ) # i c a r 2 将拥有一个不同于i c a r 的唯一的1 1 1 ) 值。 ( 2 ) 多态 多态是指可以按照同一种方式来处理不同的对象。若两个不同的组件支持 同一个接口,那么客户将可以使用相同的代码来处理其中的任何一个组件任 何c o m 接口都将实现i u n k n o w n 接口,因此c o m 库可以按一种统一的方式来处理 任何c 删组件。 2 2 3c d m 库 所有的c 删组件和客户都要完成一些相同的操作。为保证这些操作是按照 标准并且是兼容的方法完成的,c o l 定义了一个函数库以实现所有的这些操作, 分类如下; 方便建立c 0 m 应用的a p i 对于客户方,c o m 提供了基本的创建c o m 对象的函数;在组件方,提供了 输出c 0 m 对象的函数。 定位组件的a p i 从给定的组件的标识符,确定实现该组件的应用程序和它的位置。包括通 过系统注册表等间接的方法,在组件标识和相应的实现建立起联系,这样可以 使客户独立于具体实现的组件应用,组件应用可以在将来变化。 当组件是进程外组件( 本地机或远程机) 时,进行透明的远程调用 哈尔滨丁稃 学硕十学位论文 不论c o l i 对象是否运行、是否在同进程内、是在同一台计算机上还是在 不同的计算机上,c 侧允许客户以相同的方式透明的访问组件对象。这意味着 对不同类型的组件,客户和服务器的编程模式都是一样的,c 伽库屏蔽了这些 差异。从客户角度看,所有的对象都是通过接口指针访问的。接口指针必须是 相同进程的,实际上,任何对接口函数的调用总是先到达同一进程内的代码。 如果组件对象是进程内的,则调用直接到达组件对象而不需要系统底层结构代 码的介入。如果对象是进程外的,对接口函数的调用先到达c o l 自己提供的代 理对象,这个代理对象负责产生适当的远程调用来调用另个进程中或另一个 计算机上的组件对象。从组件的角度看,所有对组件接口函数的调用都是通过 指向接口的指针发出的。这个指针也必须与组件在同一进程内,因此发出接口 函数调用的代码也必须是组件进程内的代码。如果组件是进程内的服务器,则 调用者就是客户本身;否则调用者是c 删提供的残根对象,它负责接收客户进 程中的代理对象发出的远程函数调用,再将此调用转给相应的接口。 允许应用程序在自己的进程内控制内存分配的标准机制 在组件中分配块内存,然后将其通过一个输出参数传递给客户是一种非 常常见的做法。但由于客户和组件一般是由不同的程序员实现的,他们所用的 编程语言也可能不同,甚至可能是在不同的进程中运行,这就给释放这块内存 带来了困难。c 侧提供了个任务内存分配器。使用此分配器,组件可以给客 户提供一块由客户删除的内存。并且c o l 的任务内存分配器考虑了线程之问的 同步问题,因此可以在多线程应用程序中使用。 c o l 库是在o l e 3 2 d l l 中实现的,在使用静态链接时,使用o l e 3 2 l i b 。 c o t v l 库中有上百个函数,在微软的m s d n ( m i c r o s o f td e v e l o p e rn e t w o r k ) 中有 详细的函数说明。本节将对c o m 库的重要操作分以下方面进行介绍。 1 ) 0 0 m 库的初始化 在使用c 洲库中的其他函数( 除c o g e t m a l l o c 外,此函数用于任务内存分 配) 之前,进程必须先调用c o l n i t i a l i z e 来初始化c 伽库。当进程不再需要使 用c o l 库函数时。必须调用c o u n i n i t i a l i z e 。这两个函数的定义如下: h r e s u l tc o i n i t i a l i z e ( v o i d * r e s e r v e d ) ;r e s e r v e d 必须为n u i 上 v o i dc o u n i n i t i a l i z e0 ; 2 ) 创建c o l 对象 哈尔滨r 程人学硕十学 ) = 论文 c o m 组件最终是要向客户提供服务的,因此创建组件的实例对象是晟重要 的功能,也是用的最频繁的c o m 调用。 c o c r e a t e i n s t a n c e 是创建组件最简单也是使用最多的一种方法。此函数需 要一个组件标识符c l s i d 参数,在此基础上创建相应组件的一个实例,并返回 此组件实例的某个接口指针。该函数的定义如下: h i 礓s u l t s t d c a l lc o c r e a t e l n s t a n c e ( c o n s tc l s i 啮r c l s i d 组件标识符 i u n k n o 州* 1 ) u n k o u t e r ,在组件聚合时,传递外层组件接口指针 d w o r dd _ c l s c o n t e x t ,服务器种类 c o n s ti i 嘛r i i d ,接口标识符 v o i d p p v存放返回的接口指针 ) ; 在使用c o c r e a t e l n s t a n c e 函数时,客户只需知道要创建组件的c l s i d 和 要查询接口的i i d ,而不用尧0 组件的实现代码位于何处,c o m 来完成组件的定 位和创建。 c o c r e a t e i n s t a n c e 可以简单的直接创建组件,但它却没有给客户提供一种 能够控制组件创建过程的方法。当c o c r e a t e i n s t a n c e 完成后,组件实际上己经 建立好了,在建立好一个组件之后,想要控制将组件装载到内存中何处或检查 客户是否有权限来创建该组件已不可能了。为控制组件的创建过程,组件实际 上是由一个称为类工厂的组件创建的。类工厂组件的唯一功能就是创建其它组 件。类工厂组件是实现了标准接口i c l a s s f a c t o r y 的特定于某个c l s i d 的组件。 客户可以通过类工厂所支持的i c l a s s f a c t o r y 来对类工厂创建组件的过程加以 控制。i c i a s s f a c t o r y 的定义如下: i n t e r f a c ei c l a s s f a c t o r y :p u b li ci u n k n o w n h i i e s u l t s t d c a l lc r e a t e i n s t a n c e ( i u n k n o w n 印i u n k n o w n o u t e r , c o n s ti i d i i d v o i d * * p p v ) : i f l t e s u l ts t d c a l ll o c k s e r v e r ( b o o lb l o c k ) ; ) ; i c l a s s f a c t o r y 有两个成员函数。c r e a t e l n s t a n c e 的参数含义同 1 4 哈尔滨i _ 程人学硕十学位论文 c o c r e a t e i n s t a n c e ,但少了组件c l s i d 和组件类别的参数。这个函数负责建立 类工厂组件能够建立的特定c l s i d 的组件,同时请求此组件中某个接口的指针。 l o c k s e r v e r 用于将服务器保存在内存中,在使用完后在将其释放。为了增加许 可或权限功能。m i c r o s o f t 还定义了另外一个创建接口i c i a s s f a c t o r y 2 。通过 使用这个接口,类工厂可以保证客户只能获得可以合法访问的组件,并具有对 此组件的访问授权。c o m 库提供了c o g e t c l a s s o b j e c t 来创建同某个c l s i d 相应 的类厂。此函数的定义如下: 眦s u l t _ s t d c a l lc o g e t c l a s s o t j e c t ( c o n s tc l s i 陷c l s i d d w o p c dd w c l s c o n t e x t , c ( s e r v e r i n f 僻p s e r v e r l n f o ,为d c 删保留 c o n s ti i d l i d v o i d # p p v ) : 客户可以用c o g e t c l a s s o b e c t 所返回的指针来创建所需的组件,这个指针 通常是一个i c l a s s f a c t o r y 指针。实际上,c o c r e a t e l n s t a n c e 函数种调用了 c o g e t c l a s s o b j e c t 来创建类工厂组件c o c r e a t e i n s t a n c e 先调用 c o g e t c l a s s o b j e c t 来获取类厂中的i c l a s s f a c t o r y 接口指针,然后再使用此指 针来调用i c l a s s f a c t o r y :c r e a t e i n s t a n c e 完成新组件的创建。 3 ) 内存管理 程序员可以通过一个i ) a 1 o c 的c 伽接口来使用任务内存分配器,它可以 由c o g e t m a l l o 返回。为分配一块内存,可以使用i m a l l o c :a i i o c ;而由它所 分配的内存的释放则可以由i m a l l o c :f r e e 完成。但这一过程比较繁琐因此 c 侧库实现了一些帮助函数,如c o t a s k m e m a l l o c 和c o t a s k m e r r e e ,其定义如 下: v o i d * c o t a s k m e m a l l o c ( u l o n gc b ) ;要分配的字节数 v o i dc o t a s k m e m f r e e ( v o i d * p v ) ;c o t a s k m e m a l l o c 分配的内存块指针 4 ) 接口调整 在许多情况下,c 嗍将自动为

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论