当前位置首页 > 百科> 正文

组件对象模型

2019-03-16 12:21:56 百科
组件对象模型

组件对象模型

组件对象模型(Component Object Model,COM) 是基于Windows 平台的一套组件对象接口标準,由一组构造规範和组件对象库组成。一般的对象是由数据成员和作用在其上的方法组成,而组件对象和一般对象虽有相似性,但又有较大不同。组件对象不使用方法而用接口来描述自身。接口被定义为“在对象上实现的一组语义上相关的功能”,其实质是一组函式指针表,每个指针必须初始化指向某个具体的函式体。一个组件对象实现的接口数量没有限制。

基本介绍

  • 中文名:组件对象模型
  • 外文名:Component Object Model
  • 解释:一种面向对象的编程模式
  • 缩写:COM

平台介绍

COM是微软自1993年便提出的组件式软体平台,用来做进程间通信(Inter-process communication, IPC)以及当作组件式软体开发的平台。COM提供跟程式语言无关的方法实现一个软体对象,因此可以在其他环境中运行。COM要求软体组件必须遵照一个共同的接口,该接口与实现无关,因此可以隐藏实现属性,并且被其他对象在不知道其内部实现的情形下正确的使用。
COM并被实现于多个平台之上,并不限于Windows作业系统之上。但还是只有Windows最常使用COM,且某些功能已被目前的.NET平台取代。

历史

Windows 作业系统提供了三种套用程式间的通讯机制:剪贴簿(clipboard)、DDE与OLE。OLE原名是物件连结与嵌入(Object Linking and Embedding),OLE可说是DDE的改良版,OLE 1.0版提供複合档案(compound document)处理。但过于複杂,Brockschmidt, Kraig「Inside OLE」一书中提到,必须经过六个月的心灵混沌期,才能了解OLE是什幺。因此OLE 2.0后,微软提出COM架构。所有OLE元件皆是继承COM而来,这些技术包含OLE Document和OLE Controls、Drag and Drop等。

组件类型

COM是基于组件对象方式概念来设计的,在基础中,至少要让每个组件都可以支持二个功能:
  • 查询组件中有哪些界面(User Interface)
  • 让组件做自我生命管理,此概念的实践即为引用计数(Reference Counting)
这二个功能即为COM的根:IUnknown接口所提供的IUnknown::QueryInterface(),IUnknown::AddRef()及IUnknown::Release()三个方法的由来。所有的COM组件都要实现IUnknown,表示每个COM组件都有相同的能力。
只由COM派生实现出来的组件,称为纯COM组件
但在Windows持续发展时,Visual Basic 4.0开始支持OCX,也就是OLE Custom Control,这让微软开始思考要如何让COM组件可以跨语言支持,在这样的要求下,必须要提供一个一致的接口,以及提供一组可以调用接口内方法的能力,由于纯COM组件只能够支持C/C++的直接访问,为了要达到跨语言的能力,在COM中必须要支持在外部调用内部方法的机能,这个机能造就了Invoke()方法,另外为了跨语言的支持,COM应该要提供简单的组件访问识别方式,这也就是会有GetIDsOfNames()的原因,将这些方法组合起来,定义出的必要接口,称为IDispatch接口,所有实现此接口的,都可以支持跨语言的支持。
微软将实现此接口的组件都称为自动化(Automation)组件。

相关技术

COM曾是Windows平台下主要的软体开发平台,并且影响至其他许多相关软体技术。
COM+
COM+是微软Windows 2000中,Microsoft Transaction Server的强化实现版本,除了提供基本的组件交易支持外,还提供了鬆散藕合式事件(loosely-coupled events)与对象共用池(object pooling)等应用程式伺服器的能力,成为Windows 2000开始在微软平台上主要的应用程式伺服器平台,目前.NET Framework也提供了System.EnterpriseServices命名空间以支持COM+。
Distributed COM
Distributed COM是可以在网路上通信的COM组件,依据RPC(Remote Procedure Call)的规範来发展的,它将COM组件的能力扩及到网路上,但是因为网路安全以及防火墙的问题,让设备上下文OM无法广泛的流行。
.NET
.NET Framework是新一代的Microsoft Windows应用程式开发平台。
声明:此文信息来源于网络,登载此文只为提供信息参考,并不用于任何商业目的。如有侵权,请及时联系我们:baisebaisebaise@yeah.net