什么是COM

    技术2022-05-11  22

    什么是COM 在讨论COM以前,我们得认识到一个事实,编写软件实际上是一个非常 耗费时间和金钱的活动,所以人们不断寻找方法以减少这些花费,一个很重要的就是 “软件重用”。在一个理想的环境下,我们应该能够编写一次代码,在任何地方都可 以运行,即使这个环境编写者都没有想到过。当一个程序员修改了自己发布给别人使 用的函数功能后,使用者应该不需要改变或者重新编译程序就可以使用这个功能。 早期的努力是使用类库,这个工作在C++中比较常见,但是这种做法是有很大缺陷的 ,要共享C++的二进制代码是非常困难的。为了解决这个问题,程序员们试图建立一 种标准去达到软件在二进制级别上的共用。 Components Object Model (COM) 是软件组件互相通讯的一种方式。它是一种二 进制和网络标准,允许任意两个组件互相通讯,而不管它们是在什么计算机上运行( 只要计算机是相连的),不管各计算机运行的是什么操作系统(只要该系统支持 COM),也不管该组件是用什么语言编写的。COM 还提供了位置透明性:当您编 写组件时,其他组件是进程内 DLL、本地 EXE 还是位于其他计算机上的组件,对 您而言都无所谓。COM 是基于对象的——但是这种对象概念与您熟悉的 C++ 或 Visual Basic 中的对象不太一样。 首先,COM 对象被很好地封装起来。您无法访问对象的内部实现细节;您无法知道 对象使用了什么数据结构。实际上,对象的封装是如此的严密,以致于 COM 对象 通常被描绘为盒子。细节是不会告诉你的,但是我们可以通过接口来访问COM对象 里面的方法,当然如果COM组件提供商肯告诉你那些接口中的函数和属性起什么作 用的话。 概括地说,COM具有如下一些优越性: 编程技术难度和工作量降低,开发周期变短,开发成本降低。一般编程人员只须根 据应用功能要求选用合适的组件,而不必事无巨细都自己动手去完成。组件模块将编 程的技术难度和工作量在人员个体和时间上进行了分摊。我们使用ESRI的COM组件 编写程序就属于这一级别。 实现分层次的编程,从而促进了软件的专业化生产。专业人员可以开发出具有很强 专业性的软件组件,这样既保证了普通的编程应用人员能够完成所需要的应用开发, 又不至于降低使用的性能。应用人员不便实现的组件模块可以让专业人员定做。 ESRI的程序员们使用C语言为我们辨析了一个个COM组件给我们使用。 软件的复用率提高,使软件的使用效率得到提高并延长了使用寿命。组件编程体系 使大量的编程问题局部化了,使软件的更新和维护变得快速和容易,软件的成本大大 降低。新的函数功能如果在接口没有改变的情况下很容易使用。 谈了这么多COM的好处,我们该讲点技术型的东西了,我们在AO编程中需要那些 COM知识呢? 1. COM不是接口,也不是对象,它是一种标准。 2. 符合COM标准的对象就是我们要谈论的重点——COM对象。其实COM对象也无 非是实现了很多接口的对象而已。 3. COM对象必须实现Iunknown接口,这个接口是管理COM对象生命周期的,当 COM对象不使用的时候,是这个接口定义的方法负责释放内存。一个COM对象可以 没有任何别的接口,但是这个必须要,它是默认实现的接口。 4. QI,即所谓查询接口。由于COM对象有很多个接口,不同的接口管理着COM的 不同类型的方法,因此从一个接口可以使用的方法转到另一个接口可以使用的方法的 过程称为QI,这个过程是由Idispatch接口管理的。 5. GUIDs 每个组件都有一个独一无二的标识,这就是所谓的广泛唯一标识符。这个 标识符就是COM组件的身份,它是一个128bits的数字,由系统自由分配,不要担 心这个标识会有重复的一天。如果我们每秒产生1000万个UID,那么到5770年才可 能遇到重复。别告诉我那个时候我们还使用WINDOWS的玩意。 6. 一个COM对象可以有多个接口,一个接口也完全可以被多个COM对象实现。 7. 接口分为两种,内置接口和外置接口。前一种定义的是COM对象的方法和属性, 用implements实现,COM对象必须实现所有的接口内容;后一种定义的是COM对 象的事件,用withEvents实现,这种接口在实现的时候不必实现所有的内容。 8. COM组件必须被注册后才能使用,它得到注册表那里去登记“户口”。 COM组件很不错,可是它也有致命的缺陷,这个缺陷就来自它本身。我们知道, COM是可以被重用的,COM对象的实现过程也可以被修改升级(定义是不能修改的 哦),如果两个程序都使用一个COM对象,而这个COM组件升级了的话,很可能就 出现某个程序无法使用新组件的情况,这就被称为“DLL HELL(DLL灾难)”, 我们有时候安装了新软件后很多别的软件都无法使用,很多原因就是因为这个DLL HELL。别以为这是个小问题,这可是人家微软提出.NET平台的一个主要原因。

    最新回复(0)