几天前,我开始阅读 COM。然后我的一个团队成员告诉我这是一项古老的技术,现在没有人使用它。
我的问题是:
1)如果它是一项旧技术,那么有什么替代方案。
2) 为什么我不需要使用 COM。即 COM 的缺点是什么。
COM 与 C++ 一样是一种“旧技术”。仅仅因为它是旧的并不意味着它已经过时了。微软不断回归它的原因(Windows 8 大量使用它)是因为它是一种开销相对较低的基于对象的技术。在使用 COM 之前没有需要初始化的大运行时(尽管组件可以在需要时初始化运行时,例如 .NET CCW)。
接口/实现边界保持严格分离,因此它对于以面向对象的方式公开 Windows 功能很有用(以及基于 COM 的 Windows Shell 的 DirectX)。
COM 对什么是 COM 以及构建在 COM 之上的内容存在普遍误解。ActiveX、DCOM、OLE、COM+ 等都建立在 COM 之上,但没有定义 COM 是什么。COM 本身作为一项核心技术一直保持相对简单。
我说相对来说是因为 COM 并不完美。公寓模型可能会导致重大问题,例如需要应用程序泵送消息队列的跨公寓编组。早在 90 年代后期,人们就对 COM 发疯了,并且用 COM 组件制作所有东西,这给应用程序带来了不必要的复杂性。但是,它是一项经过良好测试的技术,如果使用得当,它运行良好,尤其是在为第 3 方公开或使用功能时。如果您想真正了解 Windows API,您需要了解 COM 的工作原理。
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。
最新的大型微软“技术”,用于编写 Windows 8 Metro 应用程序的 WinRT 运行时(无论现在叫什么......)完全依赖于 COM,因此它肯定不会过时。