COM 和 OLE 有啥区别?
Posted
技术标签:
【中文标题】COM 和 OLE 有啥区别?【英文标题】:What is the difference between COM and OLE?COM 和 OLE 有什么区别? 【发布时间】:2010-10-05 14:27:38 【问题描述】:COM 和 OLE 有什么区别?
【问题讨论】:
【参考方案1】: OLE = 对象链接和嵌入 DDE = 动态数据交换 COM = 组件对象模型OLE: 这是一种将一个文档的部分链接到另一个文档的部分的方法。例如,有一张嵌入了 Excel 图表的 PowerPoint 幻灯片。当 Excel 电子表格更新时,图表也应该更新。当您重新打开 PowerPoint 时,它神奇地出现了! (此示例为链接对象。)嵌入对象相同,只是 Excel 电子表格不存在于外部文件中,电子表格的数据包含在 PowerPoint 文件中。
您可以通过链接对象将 Excel、Word 和 PowerPoint 文档相互嵌入。其他应用程序是专门为支持嵌入 Word 而编写的,例如 Microsoft Equation Editor。
OLE 1 基于 DDE 构建,它使用窗口消息在源数据发生更改时通知应用程序,并且通常使用 HGLOBAL 全局内存句柄传递数据。
OLE 2 是基于 COM 构建的。
COM 是一种语言中立、面向对象的组件模型和基于 DCE RPC 的 ABI。作为一个 RPC 系统,它支持同一台机器上的进程之间的远程调用,后来,使用 DCOM,它支持不同机器上的远程调用。最初,COM 被用作 MAPI 体系结构的一部分(它使用 COM 对象模型,但不使用 COM 注册服务),然后作为具有注册和对象激活和其他服务的通用对象模型自己正式启动。 (例如名称和结构化存储。)
OLE 自动化 与 OLE 无关 - 它只是一个品牌连接。 OLE 自动化是与 Visual Basic 兼容的 COM 子集,它仅支持基本数据类型(例如无无符号整数或结构),但包括对象(COM 接口)。
OLE 控件 但是与 OLE 相关。从 VB 4 开始,它们是主要针对 Visual Basic 用户的可视化组件,但可视化元素是使用 OLE 2 的嵌入工具提供的。它们也可以由任何能够承载 OLE 2 的东西承载(理论上,如果编写得当)嵌入式对象,也经常用于 C++ 应用程序。他们通常使用与 OLE 自动化兼容的接口在运行时进行编程。
ActiveX 控件是 COM 对象的营销术语,从 Microsoft 试图普及扩展 Web 应用程序的技术开始。
【讨论】:
“OLE 自动化与 OLE 无关” - :( 感谢微软【参考方案2】:COM 是由 OLE 演变而来的。 OLE 是一组接口和数据存储机制,用于促进应用程序之间的数据共享。 COM 是使用接口的自然扩展,不仅可以共享数据,还可以共享运行时功能——其中数据以实际机制为前端,以方便使用。我一直把它大致描述为 C 和 C++ 之间的区别,在 C 中,您可以共享头文件和结构,而在 C++ 中,您可以共享封装的对象。
作为一个肥皂盒,我仍然怀念 OLE 结构化存储,因为在协作系统之间共享不透明数据存储有一些好处。看到拖放/剪贴板仍然依赖它,我想知道 .Net 的替代品会是什么?
【讨论】:
OLE 不是 COM 进化而来的。 Ole 1 早于 COM。然而,OLE2 是建立在 COM 之上的。 OLE 结构化存储仍然存在并且永远存在,如果您愿意,可以从 .Net 中使用它。请注意,与 ZIP 相比,OLE 结构化存储的许多设计动机是允许对磁盘数据结构进行就地修改。随着软盘和慢速 HD 的结束,这种情况在很大程度上已经消失了。 "Ole 1 早于 COM。但是 OLE2 建立在 COM 之上。"是的......有点像它进化了。在交互数据之间使用接口,然后数据+行为的想法来自 OLE,是 COM 的萌芽。 @Ben - 您将引用中 COM 和 OLE 的顺序与答案的实际内容相反。 @MartinSmith,是的,打错字了。 @Ben 我重复了错字,因为您似乎对我在答案中所说的内容感到困惑。如果你不是,那么你怎么能看不到 COM 接口来自于推动 OLE2 嵌入到组件化软件的下一步的必要条件?【参考方案3】:OLE 技术比 COM 作为一个单独的实体早了很长一段时间。在此之前,OLE 被实现为嵌入和链接对象的一种方式。典型的例子是在 Word 文档中嵌入电子表格。启用了 COM 的底层技术,以便 VB 等其他语言也可以与这些对象进行交互。
然后,从历史上看,我们有很多服务器类型的程序员羡慕地看着这些很酷的东西,比如语言独立性、引用计数和线程模型,但实际上根本不关心嵌入技术。合乎逻辑的做法是将底层服务器功能拆分为 COM - 这是一个更自然的低级 API。
这两种技术仍然存在。如今,OLE 与 ActiveX 有点关联,或者可能与 ActiveX 相同。
【讨论】:
以上是关于COM 和 OLE 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章