COM是一套语言无关的二进制接口规范,它定义了一套实现面向对象的组件的规则。
GUID,IID,IUnknow,IDL,都是COM规范定义的概念,它规定了对象接口如何声明,对象如何创建销毁,对象生命周期如何管理,接口如何继承和聚合。
OLE 2(OLE1已经死了)是基于COM接口的一套应用程序直接实现数据交换和协作的规范,主要用于Office系列。
ActiveX是基于COM接口的UI 组件规范,主要用来实现语言无关的可视控件,多用于浏览器和快速应用开发领域比如 VB。
此外还有几个基于COM的框架,比如 DirectX,Media Foundation等。
从Unix开始系统API一直都是以C API形式提供的,但是目前应用开发已经几乎都是面向对象语言了,纯 C 形式的系统API已经不再适应需求,有的解决方案是在C API之上封装面向对象的接口,比如Qt MFC,有的厂商则自己开发基于面向对象的系统API,这方面Apple做得最早也最好,Android则是借用了Java API,但是NDK还是C API。微软很早以前就在试图用面向对象接口替代 C 形式的 Win32 API,COM就是因此诞生的,但是由于历史包袱和业务复杂度的原因,这个进展十分缓慢,只能在保留旧有API兼容的情况下,新API尽量采用COM。直到最新的WinRT,微软更换系统API的工作算是接近完成了,但是WinRT的普及程度还是不够高。
因为市场部改过名的原因,COM、OLE和ActiveX的含义不同的人有不同的观点。写维基百科的人估计搞混了,应该挂{{来源请求}}模板,但是从版本历史来看,这内容是10年前一个IP用户加的,作者出来澄清的可能性基本为0,还是自己动手改比较快。顺便说一下这就是写论文不能引用维基百科的原因……可以随便改。
历史上发展过程是OLE 1.0 ->COM ->OLE 2.0->ActiveX这样所以你只提OLE不提版本的话文章看起来是有问题的。当然微软的COM文档八百年不更新没有迎合市场部的时尚也有责任就是。看看微软怎么说的吧(不想把脑袋搞迷糊的人可以跳过):
An ActiveX control is essentially a simple OLE object that supports the IUnknown interface --
Overview of Control and Control Container Guidelines (COM)这篇MSDN文档的作者认为ActiveX控件是一种比较简单,支持了IUnknown的OLE对象。
ActiveX control is just another term for an "OLE Object" or "Component Object Model (COM) Object." --
INFO: Difference Between OLE Controls and ActiveX ControlsQ159621这篇微软知识库文章的作者认为ActiveX=OLE对象=COM对象(咦,上面不是说等于OLE对象的简单版本么?难道OLE对象的复杂度=0所以简不简化结果都是一样的?)。然后又接着说OLE对于市场部来说是object linking and embedding only的意思了而不是再指ActiveX控件。可以预计这会把一些程序员搞迷糊……
COM is the foundation technology for Microsoft's OLE (compound documents), ActiveX (Internet-enabled components), as well as others. ---
The Component Object Model (COM)这篇MSDN文档的作者认为OLE就是复合文档 (嗯所以MFC对话框程序要支持跨应用拖放得调用OleInitialize一定是我的幻觉……),而ActiveX是面向因特网的组件(然而从VBX移植而来的那些ActiveX明明是为Visual Basic设计的啊喂,有些甚至加了kill bits主动声明自己不支持在网页里面跑)。
都是改名部惹出来的祸。
不想把脑袋搞迷糊的人可以直接看这里:
OLE是一个通讯规范。OLE 1.0的时候COM还不存在,通讯的时候用的是DDE,所以OLE曾经不是基于COM的。OLE 2.0就是基于COM了。考虑到OLE 1.0现在已经基本没人用了,说OLE是基于COM也没有什么问题。微软目前提到OLE的时候一般是特指复合文档(比如在WordPad里面插入MSPaint这样),除非加一个2.0后缀。一些人继续用OLE这个名称称呼所有OLE旗下的技术(ActiveX,剪贴板对象,拖放支持等等)。
ActiveX控件是OLE 2.0的简化版本,但是微软市场部又用ActiveX这个名字推广了Active Scripting和Active Document等等其他浏览器扩展技术,所以造成歧义(
Microsoft Announces ActiveX Technologies)。现在提到ActiveX,一般是特指面向Internet Explorer网页开发者而开发,和java小程序有竞争的控件。广义的ActiveX就是所有COM对象了。