传统的软件由单个的二进制文件组成。组件将单个二进制文件分割为多个独立的部分,每个部分都被称为一个组件。采用组件技术后,在需要对程序进行修改和改进时,只需替换某个组件模块即可。
在开发程序时可以从组件库中选择合适的组件快速构造出满足需要的应用程序。这大大提高了程序的可维护性和开发效率。
组件化程序设计思想是将复杂的应用程序被设计成小的、功能单一的组件模块。为了实现这样的软件,模块与模块之间需要一些规范,这些规范规定了模块如何划分以及模块之间的交互的问题。COM标准就是这样一组规范。
COM是Component object model的缩写。中文名为组件对象模型。Microsoft提出的COM规范不仅体现了组件化程序设计的思想,在实现中也采用面向对象程序设计方法。
COM对象是建立在二进制可执行代码级的基础上,因此COM对象是语言无关的。只要它们能生成符合COM规范的可执行代码,在任何平台都可以使用。这一特性使使用不同语言开发的组件进行交互成为可能。COM是Microsoft定义的。在windows系统平台上COM技术被应用于系统的各个层次。
组件技术是面向接口的。接口封装了软件内部的细节,只要留给客户的接口没有改变,客户端代码就不需要重新编译。软件工程一直强调软件模块的强内聚,低耦合。COM技术很好的遵循这种原则因而被广泛的使用。
在COM中,一个组件程序被称为一个模块。COM组件是以win32动态链接库dll或可执行文件的形式发布可执行代码。一个组件中可以有多个COM对象。
组件可以是一个dll,此时的组件为进程内组件。也可以是exe程序,这时的组件是进程外组件。
COM库提供了一组API,它提供对组建对象或是客户的管理服务。COM库对所有组件的操作提供了一致的接口。
由于COM的封装性,各种实现机制都被封装在了模块内部,客户在使用时仅仅需要得到接口。也就是说客户与组件是靠接口建立联系的。对于一个C++类来说它的接口是它public下的一组成员函数。对于一个dll来说它的接口是它导出的一组函数 。对于COM来说它的接口就是一组内存结构。由于使用C++来实现COM非常的简单,所以很多COM都是使用C++来写的,但是使用其他语言也是可以的,只要符合COM规范。
C++使用抽象基类来实现COM接口。COM可能有很多个接口,因此我们可以采用多重继承,从抽象基类中继承来实现多个接口。但是接口也并不一定需要继承得到,COM标准并没有要求实现某个接口的类要从某个抽象基类继承。对接口的继承仅仅是一种实现细节而已。因此,除了使用不同的抽象基类通过多重继承实现多个接口外,还可以在一个类中直接实现多个接口。
客户只能通过接口同组件打交道,对客户来说组件就是一组接口集。 客户它并不知道某个组件内部提供了哪些接口。事实上客户对组件知道的越少,在不影响客户运行的情况下组件就可以最大限度的发生变化。
接口查询
每一个COM接口都必须从IUnknown接口中继承而来。因为IUnknown接口提供了两个重要的特性:生存期控制和接口查询。
客户对于组件有哪些接口并不清楚,但是客户可以通过调用每个组件都有的IUnknown接口中的QueryInterface函数来查询组件中的接口。