【问题标题】:Do I need to use COM (component object module)我是否需要使用 COM(组件对象模块)
【发布时间】:2012-11-10 09:50:40
【问题描述】:

几天前我开始阅读 COM。然后我的一个团队成员告诉我这是一项古老的技术,现在没有人使用它。

我的问题是:

1) 如果它是一项旧技术,那么有什么替代方案。

2) 为什么我不需要使用 COM。即COM的缺点是什么。

【问题讨论】:

  • 你读过关于 COM 的文章吗?喜欢Wikipedia page on it? COM 可能是“旧的”,但它仍然是 Windows 工作方式的基础。例如,如果要访问 Excel 工作表,则必须使用 COM。
  • 如果你使用.net技术,你可能不需要使用COM
  • COM 对于大多数用途来说过于复杂,因为它试图解决大多数人没有的问题——例如跨机器分布的对象,或者与 VB 的互操作性。
  • @MarkRansom,IPC(在同一台机器上)、shell 扩展、IE 插件、OLE(包括拖放)、DirectX、Windows 运行时、进程内和会话范围的运行对象表、脚本呢? (不仅仅是 VBScript)等?

标签: c++ windows winapi com mfc


【解决方案1】:

COM 与 C++ 一样是一种“旧技术”。仅仅因为它很旧并不意味着它已经过时了。微软不断回归它的原因(Windows 8 大量使用它)是因为它是一种开销相对较低的基于对象的技术。在使用 COM 之前没有需要初始化的大运行时(尽管组件可以在需要时初始化运行时,例如 .NET CCW)。

接口/实现边界保持严格分离,因此它对于以面向对象的方式公开 Windows 功能很有用(以及 Windows Shell 基于 COM 的 DirectX)。

COM 对什么是 COM 以及构建在 COM 之上的内容存在普遍误解。 ActiveX、DCOM、OLE、COM+ 等都建立在 COM 之上,但没有定义 COM 是什么。 COM 本身作为一项核心技术一直保持相对简单。

我说相对来说是因为 COM 并不完美。公寓模型可能会导致重大问题,例如需要应用程序泵送消息队列的跨公寓编组。早在 90 年代后期,人们就对 COM 发疯了,并且用 COM 组件制作所有东西,这给应用程序带来了不必要的复杂性。但是,它是一项经过良好测试的技术,如果使用得当,它运行良好,尤其是在为第 3 方公开或使用功能时。如果您想真正了解 Windows API,您需要了解 COM 的工作原理。

【讨论】:

    【解决方案2】:

    1) 如果它是一项旧技术,那么有什么替代方案。

    COM 确实很老了。 Microsoft 的“替代品”是/是 .NET,但这意味着您需要与 CLR 一起使用(因此本机 C++ 无法使用,为此您需要 C++/CLI)。最新的替代方案现在称为 WinRT(Windows 运行时)。 WinRT 目前仅适用于 Windows 8 和 Windows Server 2012。在最低级别,WinRT 实际上是 COM,但微软已经重新考虑了它的很多陷阱。与平台/语言无关的替代方案包括 Google Protocol Buffers、Apache Thrift 和 SOAP。

    2) 为什么我不需要使用 COM。即COM的缺点是什么。

    COM 的主要用途是进程间通信 (IPC)。例如,如果您有两个用两种编程语言编写的应用程序并希望它们进行通信,那么 COM 是一种(特定于 Windows 的)解决方案。 COM 在 90 年代被广泛用于 C++ 和 VB6 应用程序之间的通信。如果您不需要 IPC,那么您对 ​​COM 的前景非常低。我们今天在工作中最常使用 COM 来跨原生 C++ 应用程序和用 C# 编写的托管 .NET 应用程序进行 IPC。

    【讨论】:

    • “我们今天在工作中最常使用COM来做IPC” DirectX就是COM,你知道的。
    • 我们在工作中不使用 DirectX 做任何事情,所以我不确定该声明对引用的文本有何影响。此外,通过 COM 执行 DirectX 仍可被视为 IPC,是吗?另一个进程恰好是一个操作系统库。
    • @BretKuhns,没有 IPC 和系统调用的 COM,实际上很多。除非您认为一个简单的完全用户空间函数调用是 IPC。 COM 确实用于 VB6 组件(我宁愿说它是选择的),但它不是与C++ 代码通信的唯一方式,你总是可以导出DLL 函数并公开函数地址。
    【解决方案3】:

    最新的大型微软“技术”,用于编写 Windows 8 Metro 应用程序的 WinRT 运行时(无论现在叫什么......)完全依赖于 COM,因此它肯定不会过时。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-13
      • 2015-09-20
      • 1970-01-01
      • 2012-02-12
      • 1970-01-01
      相关资源
      最近更新 更多