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

时间:2012-11-22 02:48:45

标签: c++ windows winapi com mfc

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

我的问题是:

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

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

3 个答案:

答案 0 :(得分:9)

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

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

COM普遍误解了什么是COM以及什么是基于COM构建的。 ActiveX,DCOM,OLE,COM +等都是基于COM构建的,但没有定义COM是什么。 COM本身作为核心技术一直保持相对简单。

我说比较,因为COM并不完美。公寓模型可能会导致严重的问题,例如需要应用程序泵送消息队列的跨公寓编组。早在九十年代后期,人们就疯狂地将COM全部用于COM组件,这导致了应用程序中不必要的复杂性。但是,它是经过良好测试的技术,如果使用得当,它可以很好地工作,特别是对于第三方的曝光或消费功能。如果您想真正了解Windows API,您需要了解COM的工作原理。

答案 1 :(得分:5)

  

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

COM肯定是老了。微软对它的“替代”是/是.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的)解决方案。在90年代广泛使用COM来在C ++和VB6应用程序之间进行通信。如果您不需要IPC,那么您的COM前景非常低。我们今天最常使用COM来跨本机C ++应用程序和用C#编写的托管.NET应用程序进行IPC。

答案 2 :(得分:1)

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