COM学习笔记(一)
近日由于项目的需要,接触到从未深入了解过的COM技术,遂决定静下心来好好学习一番。废话不多说,开始COM之旅吧。
COM(Component Object Model)是由微软提出的组件标准。在COM标准中,一个组件程序也被称为一个模块,它可以是一个dll,被称作进程内组件;也可以是一个exe,被称作进程外组件。COM是以对象为基本单元的模型,一个组件程序可以包含一个或多个组件对象,程序和程序之间进行通信是靠组件对象来实现的,而组件程序(COM程序)是提供组件对象(COM对象)的代码载体。
COM对象不同于一般面向对象语言(如C++)中对象的概念,COM对象是建立在二进制可执行代码级的基础上,而C++等语言中的对象时建立在源代码级基础上的,因此COM对象是语言无关的。这一特性是使不同的编程语言开发的组件对象进行交互成为可能。
组件的提出促进了软件的发展,使得软件升级更加灵活。当系统的外界软硬件环境发生变化或用户的需求有所更改时,并不需要对所有组件进行修改,而只需对受影响的组件进行修改,然后重新组合在一起就得到新的升级软件。组件间的通信实际上是通过接口来实现的,所以从这层意义上来看,COM还提供了组件之间的接口标准。COM组件、COM对象和COM接口三者之间的关系如图1.1所示。
图1.1 COM组件、COM对象和COM接口关系
当另外的组件或普通的客户程序调用组件功能时,它首先创建一个COM对象或者通过其他途径获得COM对象,然后通过该对象所实现的COM接口调用它所提供的服务。当所有的服务结束后,如果客户程序不在需要该COM对象,那么它应该释放掉对象所占用的资源,包括对象自身。
在COM模型中,对象本身对于客户程序来说是不可见的,客户请求服务时,只能通过接口进行。接口实际上就是一组逻辑上相关的函数的集合,其函数也被称作接口成员函数。每一个接口都是由一个128位的全局唯一标识符(GUID)来标识。客户程序通过GUID获得接口指针,再通过接口指针调用其相应的成员函数。至于具体功能的实现,则完全是由对象的接口内部实现的,所以对客户程序来说,它只需关心如何与接口通信,不必关心接口内部的实现。
与接口相似,每个对象也用一个128位的GUID来标识,成为CLSID(class identifier)。客户程序可以通过CLSID来创建COM对象,于此同时它也可以得到一个指向对象某个接口的指针(每个COM对象至少实现一个接口,没有接口的COM对象是没有意义的),因此客户程序就可以调用接口提供的服务。根据COM规范,一个COM对象如果实现了多个接口,则可以从某个接口得到该对象任意其他的接口。
COM最基本的概念就到这,欢迎一起探讨。