我需要使用COM(组件对象模块)吗

Do I need to use COM (component object module)

本文关键字:对象 组件 模块 COM      更新时间:2023-10-16

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

我的问题是:

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

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

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组件,这给应用程序带来了不必要的复杂性。然而,这是一项经过充分测试的技术,如果使用得当,它可以很好地工作,尤其是在为第三方公开或消费功能时。如果你想真正了解Windows API,你需要知道COM是如何工作的。

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

COM确实很旧。微软的"替代方案"过去是。NET,但这意味着您需要配合CLR(因此本机C++无法配合,您需要使用C++/CLI)。最新的替代方案现在被称为WinRT(Windows运行时)。WinRT目前仅适用于Windows 8和Windows Server 2012。在最底层,WinRT实际上是COM,但微软已经重新思考了它的许多陷阱。与平台/语言无关的替代方案包括Google协议缓冲区、Apache Thrift和SOAP。

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

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

最新的大型微软"技术",用于编写windows 8 metro应用程序的WinRT运行时(无论它们现在被称为什么…)完全依赖于COM,因此它肯定不会过时。