为了学习ActiveX插件的编写,从这几天开始学习COM原理。ActiveX是以COM为基础的,所以要想要比较深入的学习ActiveX技术需要先学习COM原理。

  COM是微软提出的组件标准。COM是在OLE技术的发展过程中产生的。OLE主要是实现复合文档,而且OLE1也只实现了复合文档的功能,OLE1使用的是一种被称为动态数据交换(DDE, Dynamic Data Exchange)的技术。其中DDE技术建立在Windows的消息基础之上,DDE有稳定性不好、效率低的缺点。所以,DDE很快的就被淘汰了。在OLE的第二个版本OLE2中,微软重写了OLE的大量底层代码,推出了新的COM模型。(以上内容摘自《COM原理与应用》,p10)

  COM包括了两个部分,一个是COM的规范,另一个就是提供组件程序运行所需要的环境。COM组件可以被视为一个模块,这个模块可以使动态链接库(Dll),也可以使一个可执行文件。而且COM的实现是在二进制代码上,不存在语言不同不能调用的情况,可以做到夸语言调用。而且现在大多数语言都支持COM,如C++、Java等主流语言都是支持COM的。

  COM的优势:我在最开始看COM的时候,就想到了这么一个问题。为了使用其他组件提供的功能,需要使用很多重复而麻烦的函数来载入组件,这不是很麻烦么,干嘛不直接使用dll解决问题得了。后来想了想,使用COM有几个优势。dll需要加载进入进程中去,而COM可以提供进程外的调用,甚至可以调用远程计算机上的组件。同时dll加载到进程中去以后,一旦dll中的函数崩溃,那么主进程也会崩溃。如果这是使用进程外调用,那么主进程仍然可以稳定的运行。

  面对一个具有很多功能的大型程序,我们都会很自然的想到把这些功能分成几个小块来实现。这样方便开发、测试以及维护。这些一个个的小模块就是组件。COM是一种面向对象的组件模型,支持继承、数据的封装等。COM组件就是基于COM规范的组件实现。COM对象则是某些功能的集合,这些功能都在一个抽象类中(此处是个人理解,欢迎大家拍砖)。COM接口则是COM对象用来提供服务的东西(值得注意的是,COM接口是一组用来提供一类完整服务的接口)。一个COM组件可以包含多个COM对象,一个COM对象也可以包含多个COM接口。如下图所示:

  在下一篇文章中,我将会做出一个实际的小例子,目前这个例子有点小问题,还没有弄好~