(计算机软件与理论专业论文)com组件技术探究及基于com的即时通讯软件设计.pdf_第1页
(计算机软件与理论专业论文)com组件技术探究及基于com的即时通讯软件设计.pdf_第2页
(计算机软件与理论专业论文)com组件技术探究及基于com的即时通讯软件设计.pdf_第3页
(计算机软件与理论专业论文)com组件技术探究及基于com的即时通讯软件设计.pdf_第4页
(计算机软件与理论专业论文)com组件技术探究及基于com的即时通讯软件设计.pdf_第5页
已阅读5页,还剩53页未读 继续免费阅读

(计算机软件与理论专业论文)com组件技术探究及基于com的即时通讯软件设计.pdf.pdf 免费下载

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

文档简介

塑墨兰垒兰塑艿 摘要 组件对象模型c o m 是微软提出的组件技术规范,最初目的是为了促进软件的 协同工作能力,即允许两个或更多个软件应用或组件非常容易地互相合作,即便 它们是由不同软件开发人员用不同的程序设计语言设计完成的,甚至运行在不同 的计算机和不同的操作系统上。随着技术的衍生和演变,它已成为 m i c r o s o f t n e t 的一种基础的软件技术,为组件化程序设计和多层软件结构提供 了基础平台,在w i n d o w s 操作系统和商业软件领域均得到极大的应用。 为了能够深入地理解c o m 组件模型的思想,更好地应用组件技术,本文对c o m 进行了系统而深入的分析,阐述了c o m 技术的各种概念、内容和意义。通过对 c o m 模型的探究,展示了c o m 在构造分布式应用系统时的独特优势。并依据c o m 和x m l 技术,遵循开放的即时通讯协议规范j a b b e r ,提出了支持多协议的分布 式即时通讯软件设计方案。该设计不仅可以实现系统内或同类系统间用户的信息 交互,在技术上还可以通过部署支持其它即时通讯协议的的服务器网关c o m 组件 与任意多个第三方即时通讯系统如i c q ,m s n 高度集成、互联互通。实现多服务的 单客户端集成。方案和实验发现,基于c o m 组件的分布式即时通讯软件设计方案, 可以很好地满足设计时的伸缩性要求,开发时的并行性要求以及应用时的分布式 要求,充分体现了c o m 技术的各种优点。 关键词:c o m ,接口,i n t e r f a c e ,i u n k n o w n ,o u e r y i n t e r f a c e ,j a b b e r ,x m l , 即时通讯,i n s t a n tm e s s a g i n g 些! ! 翌璺一 a b s tr a c t c o m p o n e n to b j e c tm o d e l ( c o m ) i st h ec o m p o n e n tt e c h n i c a ls p e c i f i c a t i o n p r o v i d e db ym i c r o s o f t ,d e s i g n e dt op r o m o t es o f t w a r ei n t e r o p e r a b i i i t y :t h a t i s ,t oa t l o wt w oo rm o r ea p p i i c a t i o n so r “c o m p o n e n t t oe a s i l yc o o p e r a t e w i t ho n e a n o t h e r ,e v e n i f t h e y w e r ew r i t t e n b y d i f f e r e n tv e n d o r sa t d i f f e r e n tt i m e s ,i nd i f f e r e n tp r o g r a m m i n g l a n g u a g e s ,o r i f t h e y a r e r u n n i n go nd i f f e r e n tm a c h i n e sr u n n i n gd i f f e r e n to p e r a t i n gs y s t e m s w i t h t h e d e v e l o p m e n to fc o m ,i t h a sb e e nt h ef o u n d a t i o n t e c h n o l o g y f o r m i c r o s o f t n e t ,p r o v i d i n gaf o u n d a t i o np l a t f o r mf o rc o m p o n e n ts o f t w a r e p r o g r a m m i n ga n dm u l t i p a ll a y e r ss o f t w a r ea r c h i t e c t u r e c o mh a sa c h i e v e d h u g es u c c e s si nb o t ho p e r a t i o ns y s t e ma n db u s i n e s ss o f t w a r ea p p l i c a t i o n s i no r d e rt oc o m p r e h e n dc o mi nd e t a i l sa n dm a k eab e t t e ru s eo fc o m t h i s p a p e rm a k e s a d e e p l ya n ds y s t e m i ca n a l y s i so v e rt o m 。a n de x p l a i n sa l lk i n d s o fc o n c e p t i o n s ,c o n t e n t sa n ds i g n i f i c a n c e u s i n gc o ma n dx m lt e c h n o l o g y , a b i d i n go p e ni n s t a n tm e s s a g i n gp r o t o c o l ,j a b b e r ,t h i sp a p e ra l s od e s i g n e s ac o m b a s e dd i s t r i b u t e di n s t a n tm e s s a g i n gs o f t w a r e t h i sd e s i g nn o to n l y s u p p o r tu e r s c o m m u n i c a t i o n f r o m l o c a l s y s t e m o rb e t w e e n s e m i n a r s y s t e m s ,b u ta l s of r o mo t h e ri n s t a n tm e s s a g i n gs y s t e ma si c qa n dm s n i t c a nb ep r o v e db y d e s i g na n de x p r e m e n t a t i o n ,t h i ss o f t w a r es y s t e mi s f l e x i b l ew h i l e b e i n gd e s i g e n e d ,p a r a l l ew h i l e b e i n gc o d i n g a n d d i s t r i b u t e dw h e ni t i s p u t i n t ou s e k e y w o r d s :c o m ,i n t e r f a c e ,i u n k n o w n ,o u e r y i n t e r f a c e ,j a b b e r ,x m l , i n s t a n tm e s s a g i n g c o m 组件技术探究及基于c o m 的即时通讯软件垃计 1 10 0 m 技术的发展 第1 章前言 每一种新技术从产生到成熟都有一个长期的发展历程,c o m 技术也不例外。 在m i c r o s o f t 对象技术的长期发展过程中,涌现了许多技术或术语,其中一些仍 在使用,有一些则已经被废弃或更新。 w i n d o w s 的早期版本既慢又不稳定,但通过w i n d o w s 剪贴板,可以大幅度地 简化程序之间的通信。用户可以同时运行一个以上的程序,他们位于独立的窗口, 互相之间使用剪贴板移动文字或图形。能够使用剪贴板复制和粘贴是把数据极其 方便地从一个文档复制到另一个文档的途径。用这种方式很容易创建复合文档。 不幸的是,在如图像之类的特殊格式的数据传送之后,要修改结果往往很困难。 为了提高p c 应用程序的可用性,需要为粘贴的元素提供一种途径,以便可 以使用接口,由生成元素的应用程序环境来编辑它们。为了解决这个问题, m i c r o s o f t 创立了d d e 。1 ( d y n a m i cd a t ae x c h a n g e ,动态数据交换) 协议,该协 议通过在运行的应用程序之间发送命令来交换数据。这是一项改进。但实现起来 非常缓慢和困难,不如由操作系统直接提供该能力更稳定。 1 9 9 1 年,m i c r o s o f t 通过引入一项称为o l e 。1 ( o b j e c tl i n k i n ga n de m b e d d i n g 对象链接与嵌入) 的技术,引进了对象的概念。o l e 是对d d e 的改进,但仍然易 出问题,因为它的体系结构仍然采用应用程序之间的消息系统。 值得肯定的是,o l e i 提供了一种在文档容器中更为有效的存储和维护文档各 部分( 或整个文档) 的途径。例如,可以用o l e i 用e x c e l 电子表格放到w o r d 文档 中,并在w o r d 内进行编辑。o l e i 还允许链接文件,这样对源文件的更新可以传 递给链接在其他文档中的文件副本。 虽然o l e i 的嵌入能力很有实用意义,但o l e i 仍然称不上是真正面向对象的 技术,因为它只是从源文件中引用了数据,但没有对数据进行封装。如果你重命 名了源数据文件或把它移到了硬盘的其他位置,就会导致所有o l e 联接失败。也 许o l e l 最大的成就在于,它推广了文档可以作为其他程序的功能组件的容器的 思想。 c o m 组件技术探究及基于c o m 的即时通讯软件设计 再来看v b x 控件。v b x 控件般是第三方软件提供商提供的小配件,v i s u a l b a s i c 很早就可以购买不断增多的各种流行的插件程序。这些插件也成为小配 件,它们节约了v b 程序员大量的时间和开发费用,因为程序员可以为公司的软 件项目购买许多功能模块,而不必亲自编写。可以这样说,正是这些外接式组件 市场的多样性和功能强大性,推动了v i s u a lb a s i c 的不断发展,使v b 用户日益 增多。虽然v b x 组件不是真正的对象,但它在提供非正式出售的模块化功能时仍 工作正常。v b x 组件的性能常常慢得令人失望,但这些模块化的小配件仍然对微 软对象技术的进步做出了很大的贡献。由于这些小配件的通用性和普及性的影响 遗留至今,在使用时仍然可以发现,有许多小型的应用程序在很大程度上仍然依 赖于一些特殊的v b x 组件。 1 9 9 3 年,m ic r o s o f t 推出了c o m ( c o m p o n e n to b j e c tm o d e l ,组件对象模型) , 其建立的技术基础戏剧性地改进了w i n d o w s 环境中的对象通信。m i c r o s o f t 使用 新的c o m 体系结构彻底重建o l e ,形成o l e 的第2 个版本。o l e 2 成为第一个用 c o m 架构的软件系统。由于采用了c o m ,o l e 2 比o l e l 效率更高,稳定性和灵活 性有了很大的提高。 在以后o l e 的发展过程中,由于采用了c o m 作为其底层结构,使用c o m 接口 作为程序之间通信的标准,因此,o l e 模块定制和扩充变得非常方便。每一个底 层模块可以单独升级,而且在原来软件模块的基础上,可以添加新的组件模块而 不需要改变原有的组件模块。 1 9 9 5 年,i n t e r n e t 革命给m i c r o s o f t 的技术和市场极大的刺激。m i c r o s o f t 最初低估了i n t e r n e t 革命的重要性,但1 9 9 5 年后期,m i c r o s o f t 重整了市场策 略,在该公司生产的几乎所有产品中都加入了对i n t e r n e t 的支持。 为了明确表明它进入急速发展的i n t e r n e t 革命,m i c r o s o f t 创建了一个新的 高科技商标a c t i v e ,为当前和今后与i n t e r n e t 相关的技术命名。公司决定把包 含o l e 的技术作为a c t i v e 销售。m i c r o s o f t 以w e b 为中心的重点也刺激了公司 对其他与i n t e r n e t 相关技术的开发或增强,这些产品包括a c t i v es e r v e r p a g e s ,v b s c r i p t ,v i s u a lj + + 以及v i s u a li n t e r d e v ,它们都被纳入v i s u a ls t u d i o 系列。c o m 则为所有这些新技术的无缝集成继续提供基本的体系结构。 1 9 9 6 年m i c r o s o f t 发布了分布式组件对象模型( d i s t r i b u t e dc o m p o n e n t 2 c o m 组件技术探究及基于c o m 的即时通讯软件设计 o b j e c tm o d e l ,d c o m ) “1 技术。d c o m 扩充了c o m 体系结构,为使用兼容c o m 的操 作系统并通过网络连接的计算机在二进制级别上提供对象通信服务。 1 9 9 7 年9 月下旬,m i c r o s o f t 把a c t i v ep l a t f o r m 技术重命名为w i n d o w s d i s t r i b u t e di n t e r n e ta p p l i c a t i o n sa r c h i t e c t u r e ( w i n d o w s 分布式i n t e r n e t 应用结构) ,简称w i n d o w sd n a 。w i n d o w sd n a 是m i c r o s o f t 多年积累下来的技术 精华集合起来而形成的一个完整的,多层结构的企业应用总体方案,它使得 w i n d o w s 真正成为企业应用平台。 c o m 和d c o m 已经提供了惊人的操作性,但m i c r o s o f t 正致力于使c o m 更加出 色。1 9 9 7 年秋季,m i c r o s o f t 的m t s ( m i c r o s o f tt r a n s a c t i o ns e r v e r ,微软事 务服务器) 和c o m 开发小组正式合并,c o m + “”是他们的第一个集成产品。c o m + 对c o m 和d c o m 进行了增强,这些增强可以提供更快的性能,并将显著地降低c o m 对象的复杂度。 可以说c o m + 是c o m 、d o m 和m t s 的集成,c o m + 倡导了一种新的概念,把组件 软件提升到应用层而不再是底层的软件结构,它通过操作系统的各种支持,使组 件对象模型建立在应用层上,把所有组件的底层细节留给操作系统。c o m + 不再局 限于c 0 1 v l 的组件技术,它更加注重于分布式网络应用的设计和实现,已经成为 m i c r o s o f t 系统平台策略和软件发展策略的一部分。 需要指出的是,由于c o m + 直接建立在c o m 的基础上,它发展了c o m ,但并没 有放弃c o m ,所以作为组件技术的研究重点来讲,c o m 其实是技术之本。只有真 正掌握了c o m 的底层结构之后,才有可能真正设计和开发出符合组件体系结构的 应用,才能发挥组件应用的优势。 1 2 课题意义 组件对象模型c o m 作为m i c r o s o f t 提出的基于组件的软件技术规范,为基于 组件的开发方式提供了简单,一致的模型。目前可以通过微软提供的高级软件开 发工具m f c 和a t l ,可以很方便得编写一个c o m 组件。但c o m 的概念与思想并不 容易理解。若对c o m 本身设计思想不能清楚了解,将会影响我们对c o m 技术的深 层次应用。本文通过对c o m 技术的探究,阐明了c o m 的原理,并通过方案和实验 发现,基于c o m 组件的分布式即时通讯软件设计方案在设计时的伸缩性,开发时 3 c o m 组件技术探究及耩于c o m 的即时通讯软件设计 的并行性以及应用时的分布式性方面,较传统的开发方式有了质的飞跃。 1 3 概述 本论文的主要内容共分为4 部分。 本章主要介绍了c o m 技术的发展历史。该章简要介绍了c o m 的起源、发展历 程、其技术现状及未来的应用前景。 第2 章主要探究了c o m 技术的原理及主要的技术特点。该章主要介绍了c o m 规范中的基本知识与核心内容,如对象、接口、及本课题相关的扩展技术,如可 连接对象机制。本章通过对c o m 模型的探究,来揭示c o m 在构造分布式应用系统 时的独特优势。 第3 章对基于c o m 的分布式即时通讯软件进行了系统分析和结构设计。本章 通过对当前即时通讯软件不足之处的洞察,结合开放式即时通讯协议规范 j a b b e r ,提出并设计了一个基于c o m 的分布式即时通讯系统方案。该设计不仅可 以实现系统内或同类系统间用户的信息交互,在技术上还可以通过部署支持其它 即时通讯协议的的服务器网关c o m 组件与任意多个第三方即时通讯系统如 i c q ,m s n 高度集成,实现互联互通。该方案最终显示了c o m 技术的分布式特征, 及在系统设计、研发、未来的维护与扩展方面的诸多优异之处。 第4 章对全文做了总结和展望。该章对全文进行了重新的思考。重点对基于 c o m 的即时通讯软件设计方面作了系统的总结,并对技术趋势做了展望。 4 c o m 组件技术探究及基于c o m 的即时通讯软件设计 第2 章组件对象模型c o m 探究 组件对象模型( c o m p o n e n to b j e c tm o d e l ,c o m ) 是微软公司于1 9 9 3 年创建的 一种软件组件结构标准。开发c o m 的目的是为了使应用程序更易于定制,更为灵 活。最初目标是为了对象链接与嵌入( o l e ) 提供支持。c o m 提供了创建兼容对象 的技术规范,以及运行它所需的w i n d o w s 操作系统进程间通信( i n t e r p r o e s s c o m m u n i c a t i o n ,i p c ) 规范。 c o m 规范是一套为组件构架设鼍标准的文档,提供了一种编写与语言无关的 能够按面向对象a p i 形式提供服务的组件的方法。c o m 具有一个被称作c o m 库的 a p i ,它提供了对所有客户及组件都非常有用的组件管理服务。c o m 库可以保证 对所有组件的大多数重要的操作都可以按相同的方式完成。c o m 库中的大多数代 码均可以支持分布式或网络化的组件。w i n d o w s 系统上分布式c o m ( d i s t r i b u t e d c o m p o n e n to b j e c tm o d e l ,d c o m ) 的实现中提供了一些同网络上其他组件通信所需 的代码。c o m 组件是以w i n 3 2 动态链接库( d l l s ,o c x s ) 或可执行文件( e x e s ) 的形 式发布的可执行代码。遵循c o m 规范编写的组件将能够满足对组件架构的需求。 2 1 c o m 接口 接口提供了两个不同对象间的一种连接。对由c o m 组件构成的应用程序而言, 接口比实现接口的组件更重要。使用组件来构造应用程序的最大的优点在于可以 复用应用程序的结构。如果接口设计得好,可以得到可复用性极高的结构。c o m 接口可以保护系统免受外界变化的影响。接口还可以使客户用同样的方式来处理 不同的组件,这种能力称为接口的多态。 接口是一个对象向外界暴露其功能的方式。从技术上讲,接口是包含了一组 函数的数据结构,通过这组数据结构,客户代码可以调用组件对象的功能。接口 定义了一组成员函数,这组成员函数是组件对象暴露出来的所有信息,客户程序 利用这些函数获得组件对象的服务。 c o m 组件技术探究及基于c o m 的即时通讯软件设计 2 1 1c o m 接口的内存结构 c o m 接口是包含一个函数指针数组和一个指向这个数组的指针的内存结构 “。在c 语言中可以通过使用结构类型来构造c o m 接口所要求的内存结构“。用 c + + 的纯抽象基类来实现c o m 接口更自然,方便。纯抽象基类是指仅包含纯抽象 函数的基类。在纯抽象基类中是不能实现这些纯抽象函数的,因此接口只定义功 能但并不定义具体的实现。一个c o m 组件可以实现任意数目的接口,这可以通过 对抽象基类的多重继承或使用嵌套类等方式实现。为了实现组件的自我描述和控 制自身的生存时间,c o m 规定所有的c o m 组件必须实现一个名为i u n k n o w n 的接 口。这个接口是访问c o m 组件中其他接口的起点。 客户程序用一个指向接口数据结构的指针来调用接口成员函数,接口指针实 际上又指向另一个指针,这第二个指针指向一组函数,成为接口函数表,接口函 数表中每一项为4 个字节长的函数指针,每个函数指针与对象的具体实现连接起 来。接口结构如图2 - 1 所示。 p v t a b l c v t a b l c 厂 、 l 接口指针卜_ 一接口虚表指针卜- 叶 指针函数1 指针函数2 对象实现 指针函数3 图2 一l 接口结构 i u n k n o w n 的定义包含在w i n 3 2s d k 中的u n k n w 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 l h r e s u l t s t d e a l lq u e r y i n t e r f a c e ( c o n s ti i d i i d ,v o i d * * p p v ) = 0 : v i r t u r a lu l o n g s t d c a l lh d d r e f ( ) = o : v i r t u r a lu l o n g s t d c a l r e l e a s e 0 = o : ) 6 c o m 组件技术探究及基于c o m 的即时通讯软件设计 在上面的定义中使用s t r u c t 定义接口i n t e r f a c e ,这是因为在c + + 中s t r u c t 关键字除了成员属性默认为p u b 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 用来减少这一值。 所有的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 函数获取它所支持的其他接口。若某个接口的前三个函数不是 这三个,那么它将不是一个c o m 接口。所有的接口指针同时也是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 w n v i r t u r a l v o i d s t d c a l lr u n ( u n i th o u r s ) = 0 : v i r t u r a lv o i d s t d c a l ls h o w k m 0 = 0 : i c a r 从c o m 的根接口i u n k n o w n 继承来,并实现了两个新函数r u n 和s h o w l ( h i 。 7 c o m 组件技术探究及基于c o m 的即时通讯软件设计 r u n 是使汽车按参数h o u r s 指定的小时数行驶的函数;s h o w k m 是用来显示汽车行 驶里程的函数。 c o m 定义的每一个接口都必须从基本接口i u n k n o w n 继承过来,i u n k n o w n 接 口提供了两个非常重要的方法:生存期控制和接口查询。 每一个接口在设计时都被分配一个二进制名字,被称为全局唯一标识符 ( g l o b a l l yu n i q u ei d e n t i f i e r ,g u i d ) 。 2 1 2c o m 接口的特性 2 1 2 1 接口的不变性 c o m 接口最令人震撼的特点是,一旦公布了一个接口,它将永远保持不变。 升级组件时,不会修改已有的接口,而是加入一些新的接口。在c o m 中,用一个 1 2 8 比特( 1 6 个字节) 的g u i d ( g l o b a l l yu n i q u ei d e n t i f i e r 全局唯一标识符) 的 结构来标识一个接口,称为i i d ( i n t e r f a c ei d e n t i f i e r ) 。根据定义,g u i d 在时 间和空间上都是唯一的,可以保证每个接口标识符都是唯一的。微软提供了两个 产生g u i d 的程序:命令行方式的u u i d g e n e x e 和对话框方式的g u i d g e n e x e 。 另外,在微软的集成编程环境v i s u a ls t u d i o 中编写c o m 组件时,系统会自动生 成g u i d ,并加入到源程序中。g u i d 的定义如下: t y p e d e fs t r u c t g u i d u n s i g n e dl o n gd a t a l : u n s i g n e dl o n gd a t a 2 : u n s i g n e dl o n gd a t a 3 : u n s i g n e dl o n gd a t a 4 8 : ) g u i d : 当加入新的接口时,接口的i 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 u n k n o w n c o m 组件技术探究及基于c o m 的即时通讯软件设计 v o i d s t d c a l lr u n ( u n i th o u r s ,f l o a ds p e e d ) 2 0 f l o a ts t d c a l1s h o w k m ( ) = o : i c a r 2 将拥有一个不用于i c a r 的唯一的i i d 值。 2 1 2 2 多态 多态是指可以按照同一种方式来处理不同的对象。若两个不同的组件支持同 一个接口,那么客户将可以使用相同的代码来处理其中的任何一个组件。任何 c o m 接口都将实现i u n k n o w n 接口,因此c o m 库可以按一种统一的方式来处理任 何c o m 组件。 2 2c o m 组件 c o m 接口定义了接口的功能,功能的具体实现则是在c o m 组件中完成的。一 个c o m 组件可以实现任意数目的接口,这可以通过对定义接口的抽象基类的多重 基类或使用嵌套类等方式来实现。同接口一样,c o m 组件也需要一个唯一的g u i d 值来标识自身,表示组件的g u i d 称为c l s i d ( c l a s si d e n t i f i e r ) 。 2 2 1 c o m 组件的实现方式 c 0 m 组件作为c o m 接口的具体实现,是以二进制目标代码的形式存在于动态 链接库或独立的可执行程序中的“1 。以动态链接库形式存在的组件可以是进程内 的也可以是进程外的,以可执行程序形式存在的组件只能是进程外组件。 2 2 1 1 以动态链接库的形式实现c o m 组件 组件可以在动态链接库( d l l ) 中实现。d l l 可以共享它们所链入的应用程序的 地址空间,因此客户可以方便地访问接口的函数指针列表。c o m 使用了d l l 来给 组件提供动态链接的能力,同时也提供了一种更有效,更规范地利用d l l 的方法。 除了要实现前面第二节讲的接口实现代码外,作为c o m 组件的d l l 需要输出以下 9 l l a a r r u u t t r r l l v v c o m 组件技术探究及基于c o m 的即时通讯软件设计 四个函数: s t d a p id 1 l g e t c l a s s o b j e c t ( c o n s tc l s i d & c l s i d ,c o n s ti i d & i i d ,v o i d * * p p v ) : s t d a p id 1 r e g i s t e r s e r v e r ( ) : s t d a p id 1l u n r e g is t e r s e r v e r ( ) s t d a p id l1 c a n u n l o a d n o w ( ) : s t d a p i 是代表e x t e r n “c ”h r e s u l t s t d c a l1 的宏。 第一个函数d 1 1 g e t c l a s s o b j e c t 的三个参数与上节介绍的 c o g e t c l a s s o b j e c t 的三个参数是相同的。第一个参数为类厂将要创建的组件的 c l s i d ;第二个参数为类厂中客户希望得到的接口l i d 。而接口的指针将被返回 在最后一个参数中。将c l s i d 传给d 1 l g e t c l a s s o b j e c t 使得一个d l l 可以支持任 意数目的组件,因为d l l g e t c l a s s o b j e c t 可以用c l s i d 来选择合适的类厂。 d 1 i r e g i s t e r s e r v e r 和d l l u n r e g i s t e r s e r v e r 的作用是在系统注册表中登记 d l l 中的组件或取消组件的登记。因为d l l 不能独立运行,w i n d o w s 系统提供了 一个用来注册和取消注册组件的应用程序r e g s v r 3 2 e x e 。这个程序将调用d 1 l 中的d l l r e g i s t e r s e r v e r 和d 1 1 u n r e g i s t e r s e r v e r 来完成组件的登记和撤销。 最后一个函数d l l c a n u n l o a d n o w 用来确定d l l 是否仍在提供对组件的支持。 d l l 将维护一个关于组件的计数值,还常常单独在维护一个服务器加锁的计数 值,当它们均为零时,此函数将给出可以释放d l l 的肯定回答。 前一节提到过为了控制组件的创建过程,c o m 将通过一个称为类厂的组件来 创建其他组件。因为类厂的一个实例只能创建同某个c l s i d 相应的组件,因此一 般情况下,类厂组件是由组件的开发人员实现并包含在与它所创建的组件相同的 d l l 中,从而类厂可以知道并且确定具有它所创建的组件的一些特殊知识。类厂 知道如何创建相应的组件并将这一点封装起来,以便客户能够尽可能的同组件所 具有的特殊需求分开。 2 2 1 2 以可执行程序的形式实现c o m 组件 在某些情况下,需要用e x e 来实现组件,这样e x e 可以向外界提供自己擅长的服 务功能,客户可以使用这些接口完成自己不能完成或很难完成的任务,而且客户 l o c o m 组件技术探究及基于c o m 的即时通讯软件设计 还可以通过接口来控制应用程序,更灵活,更有效的使用已有的程序,从而使 e x e 本身的价值也得到了提高。 在e x e 中实现组件与在d l l 中实现组件主要有两个大的差异,一是e x e 中提 供的组件将与客户程序运行在不同的进程中,这需要用前面提到的代理存根机 制来在跨进程的调用中完成参数的调整;二是e x e 不象d l l ,它是主动的,可以 对自己的生命期进行控制。e x e 也无法输出函数,因此d l l 组件的四个输出函数 的功能需要使用不同的方式来实现,一用来输出组件对象和控制e x e 的生命期。 第一点差异可以通过使用接口定义语言i d l 和相应的微软提供的编译器m i d l 来 解决,详细说明在后面介绍;第二点差异则主要涉及到组件类厂的修改,而组件 自身的代码可以保持不变。 下面首先说明在e x e 中如何实现d l l 中的四个输出函数的功能。 因为e x e 可以对自己的生命期进行控制,如它可以监控加锁计数值,并在此 值为零时将自己从内存中卸载掉。因此e x e 不需要实现d l l c a n u n l o a d n o w 。 d l l 是通过另外的应用程序如r e g s v r 3 2 e x e 来加载并调用输出函数 o li r e g i s t e r s e r v e r 和o l1 u n r e g is t e r s e r v e r 来进行组件的注册和撤消的。因为 e x e 是可独立运行的,因此e x e 可以自己调用这些函数来完成注册和撤销,只是 一个时机的问题。常用的一种方法是通过提供相应的命令行参数,如r 和u 来 分别激活注册组件的r e g i s t e r a l l 和撤销组件注册的u n r e g i s t e r a l l 。具体函数 的实现机制是相同的,但注册项有些差异,因为d l l 是注册进程内组件而e x e 是注册进程外组件,这些差异在后面有具体说明。 替换d 1 1 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 m 的c o g e t c l a s s o b j e c t 将调用d l l 输出的d 1 l g e t c l a s s o b j e c t 函数。d 1 1 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 指针,此指针将被用来创建相应的组件。由于e x e 不输出d 1 1 g e t c l a s s o bj e c t , 因此c o g e t c l a s s o b j e c t 不能从e x e 本身直接获取一个i c l a s s f a c t o r y 指针。为 此,c o m 在内存中维护了一个关于被登记的类厂的内部表格。当客户用合适的参 数调用c o g e t c l a s s o b j e c t 时,c o m 将首先检查此关于类厂的私有表格,以得到 与客户请求的c l s i d 相应的类厂。若相应的类厂不在此表格中,c o m 将在注册表 中进行查找并以e m b e d d i n g 为参数启动相应的e x e ,e m b e d d i n g 参数指示e x e 不 c o m 组件技术探究及基于c o m 的即时通讯软件设计 必显示用户界面,只需提供相应的组件即可。此e x e 将完成相应类厂的登记。并 且此时e x e 必须登记它所支持的所有类厂,这将通过调用c o m 函数 c o r e g i s t e r c l a s s o b j e c t 来完成。当服务器被关闭时,e x e 必须从内部表格中删 除相应的类厂。为此可以使用c o m 库函数c o r e v o k e c l a s s o b j e c t 。下面是这两个 函数的定义: s t d a p ic o r e g i s t e r c l a s s o b j e c t ( r e f c l s i dr c l s i d , i u n k n o w n * p u n k , d w o r dd w c ls c o n t e x t , d w o r df l a g s , l p d w o r df l a g s , l p d w o r dl p d w r e g is t e r ) : h r e s u l tc o r e v o k e c l a s s o b j e c t ( d w o r dd w r e g i s t e r ) : 使用c o r e g i s t e r c l a s s o b j e c t 登记类厂是一个比较简单的过程,只需建立相 应的类厂并将其接口指针传给该函数的第二个参数即可。第一个参数是被登记的 类的c l s i d ,最后一个参数是用来保存系统返回的用于撤销类厂登记时用的数 值。第三个参数的类型同c o c r e a t e l n s t a n c e 的第三个参数,用来控制组件运行 的环境;第四个参数用来控制组件的连接方式。这两个参数对 c o r e g i s t e r c l a s s o b j e c t 的行为进行控制,并且其中一个参数的含义依赖于另外 一个含义。常用的参数组合有: 1 c l s c t x _ l o c a ls e r v e r 和r e g c l s s i n g l e e u s e r 指定该e x e 组件服务器同一个 s d i 应用程序类似,只能提供单一的组件。 2 c l s c t x _ l o c a l _ s e r v e rlc l s c t x _ i n p r o c s e r v e r 和r e g c l s _ m u l t is e p a t a t e 或 c l s c t x l o c a l _ s e r v e r 和r e g c l s _ m u l t i p l e u s e 这两组参数组合的含义相同。 调用c o r e v o k e c l a s s o b j e c t 来撤销e x e 组件注册的类厂很简单,只需要用 c o r e g s i t e r c l a s s o b j e c t 在最后一个参数中返回的系统分给该类厂的数值作参 数即可。 c o m 组件技术探究及基于c o m 的即时通讯软件设计 2 2 1 3 列集( m a r s h a l i n g ) 机制,代理,存根及其实现 前面提到,要想使e x e 正确的提供组件功能,还需要一个作为代理存根的 动态链接库,用来向客户进程注入组件代理和向组件服务器进程注入存根代码, 完成进程闾调用的参数调整功能。只有这样客户才能透明的使用进程外服务器提 供的组件。首先说明c o m 的参数列集机制。1 。 参数列集机制是一种使客户在一个进程内透明的对进程外组件对象进行接 口函数调用的机制。不管进程外组件对象位于本地还是远程,列集都涉及到以下 两步:一是使服务器进程内的接口指针对客户进程的代码可用,这涉及到要建立 某种进程间通信;二是要将客户调用接口函数的参数传送到服务器对象所在的进 程中。 对于第一步,在客户端c o m 使用了一个称为代理( p r o x y ) 的进程内组件,并 将其注入客户进程。代理组件是一个行为和被代理组件相同的组件,但它一般只 是在客户和服务器组件之间起桥梁作用,没有实现服务器组件的功能,只是将客 户的调用传给服务器组件,并在服务器组件执行完后将返回值和参数返回给客 户。这样客户执行的仍然是进程内调用,好像服务器可以直接被调用一样。同样, 在服务器一端,c o m 注入了一个称为存根( s t u b ) 的进程内组件,它接受客户端代 理传来的进程间调用,并在服务器进程中进行实际的服务器组件调用,服务器

温馨提示

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

评论

0/150

提交评论