什么是 COM?
COM 全称为 Component Object Model,是微软为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术。在 COM 构架下,人们可以开发出各种各样的功能专一的组件,然后将它们按照需要组合起来,构成复杂的应用系统。由此带来的好处是多方面的:
- 可以将系统中的组件用新的替换掉,以便随时进行系统的升级和定制
- 可以在多个应用系统中重复利用同一个组件
- 可以方便的将应用系统扩展到网络环境下
- COM 与语言,平台无关的特性使所有的程序员均可充分发挥自己的才智与专长编写组件模块
- 等等
接口的结构与描述
COM 把接口与实现分离开的动机主要有两个:
- 升级。把对象内部的工作细节对客户隐藏起来,使得实现类内部的数据成员的数量、类型以及内部的方法都可以发生变化,而客户程序无需重新编译。客户在运行时询问对象,以便发现对象的扩展功能(是否实现了其他的接口?)
- 编译器独立性。
COM 规范规定:接口是包含了一组函数的数据结构,通过这组数据结构,客户可以调用组件对象的功能。接口的结构如下所示:
使用 C++/C/C# 描述接口
假设我们要做一个简单的计算器,提供以下函数:
int add(int num1, int num2);
int sub(int subtrahend, int minuend);
- 使用C++的类来描述接口的结构
class ICalculator
{
public:
virtual int __stdcall add(int num1, int num2) = 0;
virtual int __stdcall sub(int subtrahend, int minuend) = 0;
};
类 ICalculator 的内存结构与 COM 接口规范要求的完全一致。见下图:
- 使用 C 语言描述接口的例子
struct ICalculator {
//接口包含一个指针,指针指向一个虚表结构
struct ICalculatorVtbl *pVtbl;
};
struct ICalculatorVtbl