COM(Component Object Model) 定义了一个在运行时可复用组件直接进行二进制的交互时的标准。说白了,就是进程、组件之间数据交换的标准。只要按照这个标准来实现,进程、组件就可以跨越机器的界限交换数据,包括函数调用,参数传递等等。既然是二进制标准,那就应该是跟语言无关的,不管你用C++,C还是Java或者Python都可以在Linux或者其他系统上实现一套COM,然后跟现在微软的COM进行通信,事实上COM对语言有一点要求,就是必须支持function pointer,那C是可以的,Java就不行了。 为什么COM必须要求语言支持function pointer呢?因为指针可以隐藏实现的细节,比如,你现在有一个interface pointer,你是不知道到底它指向什么的,只有执行起来,才知道调用哪个实现。那为什么不用引用或者Java中类似的方法呢?引用不能调用方法啊!
首先看COM是由哪些部分组成的:
- host system提供run-time environment能够满足COM标准的要求;
- Interfaces 定义了feature contracts,component实现了这些interface,也就是实现了feature;
- Server 负责把component提供给host system,client则使用component提供的feature;
- registry用于跟踪component被部署在本地还是远端的机器;
- Service Control Manager处理client对某个component的请求。比如client调用CoCreateInstance, COM library会向SCM询问提供该component的server在什么地方,SCM找个server的位置,并使用server的class factory请求创建COM object,成功后,COM library就回返回interface pointer给client。
- structured storage protocol定义了如何navigate 文件系统中的文件;比如COM中有个IStorage和IStream两个接口,用这两个接口可以访问本地/远端的文件系统,并且可以在进程之间传递;
Notes:COM library is the implementation of the standard API functions defined in COM along with support for communicating between objects and clients. The COM Library is then the underlying "plumbing" that makes everything work transparently through RPC