问题

ActiveX、OLE、COM 之间的关系到底是什么样的?

回答
ActiveX、OLE 和 COM 是三个紧密相关但又有所区别的技术概念,它们在 Windows 平台上扮演着重要的角色,尤其是在软件组件化和互操作性方面。要理解它们之间的关系,我们需要从 COM 这个底层基础开始,然后向上逐步理解 OLE 和 ActiveX。

1. COM (Component Object Model) 基础与基石

COM 是三者中最基础、最底层的概念。你可以将其想象成一个通用的协议或规范,定义了如何在 Windows 操作系统中创建和使用可重用的软件组件。它是一种二进制标准,这意味着 COM 组件在编译后可以独立存在,并且不同语言编写的组件可以相互通信和协作,而无需知道对方是如何实现的。

核心思想:

组件化: 将复杂的软件功能分解成小的、可独立部署和升级的组件。
接口: COM 组件不直接暴露其实现细节,而是通过接口(Interfaces)对外提供服务。接口是一组预定义的方法(函数),就像一个合同,规定了组件能做什么以及如何调用这些方法。
二进制兼容性: COM 保证了二进制级别的兼容性。这意味着即使组件的实现发生了变化(例如,修复了 bug 或添加了新功能),只要其接口保持不变,使用该组件的其他应用程序就不会受到影响。
独立性: COM 组件可以独立于应用程序进行开发、安装、更新和卸载。
语言无关性: 由于 COM 是一个二进制标准,任何支持 COM 规范的编程语言(如 C++, C, Visual Basic, Delphi 等)都可以创建和使用 COM 组件。
注册表: COM 组件的信息(如 CLSID Class Identifier,ProgID Programmatic Identifier,以及组件的位置)通常存储在 Windows 注册表中,使得系统能够找到并加载它们。

关键概念:

Interface: 一组方法(函数签名)。COM 组件通过实现一个或多个接口来提供功能。
GUID (Globally Unique Identifier): 全局唯一标识符,用于唯一标识接口 (IID Interface ID) 和组件类 (CLSID)。这确保了即使有多个同名组件,它们也可以被唯一区分。
Aggregation & Containment: 允许一个 COM 对象包含另一个 COM 对象,并暴露其功能,这是一种重要的重用机制。
Reference Counting: COM 使用引用计数来管理对象的生命周期,防止内存泄漏。

总结: COM 是一个通用的组件模型,它提供了一种标准化的方式来定义组件之间的交互。它是一个技术框架,而不是一个具体的应用程序或用户界面技术。

2. OLE (Object Linking and Embedding) 早期应用与集成

OLE 是在 COM 的基础上发展起来的,是COM 的一个早期应用和扩展,主要关注文档集成和应用程序互操作性。OLE 使得用户可以将一个应用程序创建的对象(例如,Word 文档中的 Excel 表格、图片文件)嵌入到另一个应用程序的文档中,或者链接到另一个应用程序的文档。

核心思想:

对象嵌入 (Embedding): 将一个应用程序创建的“对象”直接存储在另一个应用程序的文档中。当用户双击嵌入的对象时,会启动创建该对象的应用程序(或其特定视图)来编辑该对象。
对象链接 (Linking): 在一个文档中存储指向另一个应用程序创建的对象(文件)的引用。当文档被打开时,链接的对象会根据需要进行更新。
自动化 (Automation): OLE 引入了自动化(早期称为 OLE Automation),允许一个应用程序控制另一个应用程序的功能,例如,通过脚本或另一个应用程序来操作 Word 文档或 Excel 工作表。这为宏和脚本语言提供了强大的支持。
复合文档 (Compound Documents): OLE 允许一个文档包含多个不同类型的嵌入式对象,形成一个复杂的复合文档结构。

与 COM 的关系:

OLE 完全建立在 COM 的基础上。OLE 的所有功能,如对象创建、接口通信、数据传输等,都依赖于 COM 的底层机制。
OLE 定义了许多特定的 COM 接口,用于实现嵌入、链接、自动化等功能。例如,`IOleObject`、`IOleContainer`、`IDataObject` 等。
你可以将 OLE 看作是 COM 的一个应用场景,是 COM 被用来解决文档集成和应用程序互操作性问题的一种具体实现。

总结: OLE 是一个更高级别的规范,它利用 COM 技术实现了文档的嵌入、链接和应用程序的自动化控制。它使得不同应用程序之间能够更紧密地协同工作,为“所见即所得”的文档编辑体验奠定了基础。

3. ActiveX 增强的 OLE 与 Web 集成

ActiveX 是 OLE 的一个演进和扩展,特别强调了在 Web 浏览器中提供丰富的交互式内容和应用程序。它将 OLE 的许多特性带到了 Web 上,使得开发者可以使用熟悉的工具(如 Visual Basic, C++)创建可以在 Web 页面上运行的组件,而不仅仅是在桌面应用程序中。

核心思想:

Web 组件化: 允许将应用程序的功能打包成可在 Web 浏览器中下载和运行的组件(ActiveX控件)。
丰富的用户界面: ActiveX 控件可以提供比传统 HTML 更丰富的用户界面和交互性,例如动画、视频播放、3D 图形等。
利用现有 OLE 组件: 许多现有的 OLE 组件可以直接或稍加修改就可以成为 ActiveX 组件。
更轻量级: 相较于完整的 OLE 应用程序嵌入,ActiveX 控件通常更小巧,便于通过网络分发。
事件处理: ActiveX 组件能够向宿主应用程序(如浏览器)发送事件,实现更动态的交互。

与 COM 和 OLE 的关系:

ActiveX 是 COM 的一个子集(或者说,更专注于特定应用场景下的 COM 规范)。所有 ActiveX 组件都遵循 COM 的二进制标准,因此也都是 COM 对象。
ActiveX 是 OLE 的一个扩展和演进。它继承了 OLE 的许多核心技术,例如对象的链接和嵌入的概念,以及自动化控制的能力。但它更加侧重于客户端(通常是浏览器)的交互和动态性。
ActiveX 定义了一些新的 COM 接口和规范,专门用于支持 Web 环境下的组件使用。

区别和侧重点:

OLE 的侧重点是文档集成和应用程序的互操作性。
ActiveX 的侧重点是将应用程序功能带到 Web 浏览器中,提供丰富的用户体验。

需要注意的方面:

安全性问题: ActiveX 的强大功能也带来了安全风险。由于可以在用户的机器上执行代码,需要谨慎处理信任问题,否则可能被恶意软件利用。因此,现代浏览器对 ActiveX 的支持已经非常有限甚至不再支持。
平台依赖性: ActiveX 是 Windows 特有的技术,在非 Windows 平台上无法使用。

总结: ActiveX 是基于 COM 和 OLE 的技术,将应用程序组件化能力扩展到了 Web 浏览器领域,使得在网页上实现复杂的交互和动态内容成为可能。

三者关系的类比

我们可以用一个简单的类比来理解它们的关系:

COM: 就像是一套通用的通信协议和语言(比如,蓝牙协议或 WiFi 标准)。它定义了设备之间如何连接、如何交换信息,但它本身不提供具体的设备。
OLE: 就像是利用这套通信协议制造了一批智能设备(比如,能够发送和接收数据的手机),并规定了它们如何协同工作以完成特定任务(比如,在不同的应用之间共享联系人信息或播放音乐)。它关注的是设备之间的互操作性和功能集成。
ActiveX: 就像是把其中一些智能设备(比如,能够显示视频和接收用户输入的触摸屏手机)设计得特别适合在特定的环境(比如,一个专门的媒体播放器应用)中使用,并且能够通过网络方便地获取和更新。它更侧重于在特定场景下提供丰富的用户体验和功能。

总结:

1. COM 是基础: 它提供了一个通用的、二进制兼容的组件模型,定义了组件如何被创建、发现和交互。它是所有其他技术(包括 OLE 和 ActiveX)的底层支撑。
2. OLE 是应用和扩展: 它利用 COM 技术,专注于文档的嵌入、链接以及应用程序之间的自动化控制,实现了更高级别的应用集成。
3. ActiveX 是 OLE 在 Web 上的演进: 它进一步利用 COM 和 OLE 的思想,将应用程序组件的能力带到 Web 浏览器中,提供更丰富的用户交互和动态内容,但因此也带来了安全和平台依赖性的问题。

所以,它们的关系是:COM 是底层协议,OLE 是基于 COM 的应用场景和规范,而 ActiveX 是 OLE 在 Web 时代的具体实现和演进。

网友意见

user avatar

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的普及程度还是不够高。

user avatar

因为市场部改过名的原因,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 Controls

Q159621这篇微软知识库文章的作者认为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对象了。

类似的话题

  • 回答
    ActiveX、OLE 和 COM 是三个紧密相关但又有所区别的技术概念,它们在 Windows 平台上扮演着重要的角色,尤其是在软件组件化和互操作性方面。要理解它们之间的关系,我们需要从 COM 这个底层基础开始,然后向上逐步理解 OLE 和 ActiveX。 1. COM (Component .............
  • 回答
    ActiveX 嘛,说实话,它就像是那个曾经叱咤风云的老前辈,在互联网的黎明时期,它确实是带来了不少新奇玩意儿,让网页不再是静态的文字和图片,可以实现一些动态的交互,比如播放视频、玩游戏,甚至进行一些复杂的图形操作。你想啊,在那个年代,能直接在浏览器里看到一段动画,或者点一下按钮就能跟网页互动,这绝.............
  • 回答
    Active Directory (AD) 的学习曲线,我觉得不能一概而论地说它“难”或者“不难”,更像是“深”和“广”。刚开始接触 AD,你可能会觉得有点迷茫。毕竟,它不像一个简单的软件,点点鼠标就能用。它是一个庞大而复杂的系统,涉及到很多概念和组件。你会听到各种各样的术语:域、组织单位 (OU).............
  • 回答
    在机器学习的世界里,我们总希望能让机器自己学习,但往往需要大量的标注数据才能达到理想的效果。如果你是个对数据标注感到头疼的研究者或者工程师,那么“主动学习”(Active Learning, AL)这个概念,很可能会让你眼前一亮。简单来说,主动学习就是一种“聪明的”学习策略。它不是被动地接收所有的数.............
  • 回答
    主动学习(Active Learning)这个领域,近几年确实是风起云涌,发展势头非常迅猛。过去我们谈主动学习,可能更多地聚焦于如何更智能地选择“最有用”的样本去标注,以期在有限的标注预算下,让模型学得更好。但现在的研究,已经不再局限于此,而是向着更深、更广的方向拓展。核心理念的深化:从“有用”到“.............
  • 回答
    主动学习,顾名思义,就是让机器“主动”地去学习,而不是像传统的监督学习那样,被动地等待我们给它提供大量的标注数据。它的核心思想是:在数据标注成本高昂的情况下,让机器自己去挑选最有价值、最能帮助它提升模型性能的数据来进行标注。 想象一下,如果你有一个学生,他遇到难题时,不是胡乱瞎猜,而是主动去请教老师.............
  • 回答
    .......

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有