组件对象模型(Component Object Model,COM) 是基于Windows 平台的一套组件对象接口标准,由一组构造规范和组件对象库组成。一般的对象是由数据成员和作用在其上的方法组成,而组件对象和一般对象虽有相似性,但又有较大不同。组件对象不使用方法而用接口来描述自身。接口被定义为“在对象上实现的一组语义上相关的功能”,其实质是一组函数指针表,每个指针必须初始化指向某个具体的函数体。一个组件对象实现的接口数量没有限制。
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的根:
IUnknown接口所提供的IUnknown::
QueryInterface(),IUnknown::AddRef()及IUnknown::
Release()三个方法的由来。所有的
COM组件都要实现IUnknown,表示每个COM组件都有相同的能力。
但在Windows持续发展时,
Visual Basic 4.0开始支持
OCX,也就是OLE Custom Control,这让微软开始思考要如何让COM组件可以跨语言支持,在这样的要求下,必须要提供一个一致的接口,以及提供一组可以调用接口内方法的能力,由于纯
COM组件只能够支持
C/C++的直接访问,为了要达到跨语言的能力,在COM中必须要支持在外部调用内部方法的机能,这个机能造就了Invoke()方法,另外为了跨语言的支持,COM应该要提供简单的组件访问识别方式,这也就是会有GetIDsOfNames()的原因,将这些方法组合起来,定义出的必要接口,称为
IDispatch接口,所有实现此接口的,都可以支持跨语言的支持。
COM+是微软Windows 2000中,Microsoft Transaction Server的强化实现版本,除了提供基本的组件交易支持外,还提供了松散藕合式事件(loosely-coupled events)与对象共用池(object pooling)等应用程序服务器的能力,成为
Windows 2000开始在微软平台上主要的应用程序服务器平台,目前
.NET Framework也提供了System.EnterpriseServices
命名空间以支持COM+。
Distributed COM是可以在网络上通信的
COM组件,依据
RPC(Remote Procedure Call)的规范来发展的,它将
COM组件的能力扩及到网络上,但是因为网络安全以及
防火墙的问题,让
设备上下文OM无法广泛的流行。