什么是 COM - 为什么 Windows COM 的设计至今依然优美

· · COM, ActiveX, Windows 开发

什么是 COM?

COM(Component Object Model)是 让 Windows 上的组件彼此交互的「二进制契约」。它是一种跨越语言与编译器差异,通过 接口这种严格契约 来通信的机制,其根本理念是「面向契约而非实现进行编程」的设计思想。

COM 的三个重要构成要素

1. 以接口为中心的设计

在 COM 中,「契约先于实现」。即使不了解对象的内部实现,只要知道其公开的接口就可以使用它。

2. 通过 GUID(CLSID / IID)进行识别

每个组件和接口都会被赋予 全球唯一的 ID(GUID),因此名称冲突从根本上不会发生。

3. IUnknown

所有 COM 接口都会继承的基本接口,提供以下三个功能。

方法 作用
QueryInterface 询问对象是否支持另一个接口
AddRef 增加引用计数
Release 减少引用计数(归零时销毁自身)

COM 的四大优势

1. 二进制兼容性

一次构建完成的组件,可以 不受编程语言或运行时限制 地重用。用 C++ 编写的 COM 组件被 C# 或 Python 调用,是很平常的事情。

2. 接口分离

由于完全隐藏实现,只公开契约,因此即使自由更改内部实现,也不会影响调用方。

3. 版本共存

为了在保持向后兼容性的同时添加功能,基本做法是不断 添加新接口。这样可以在不修改旧接口的前提下提供新功能。

4. 跨越进程边界的重用

使用 Out-of-proc COM(EXE 服务器),可以 安全地调用其他进程中的功能。不过,一旦服务器进程崩溃,调用方会收到 RPC_E_DISCONNECTEDRPC_S_SERVER_UNAVAILABLE 之类的失败返回,因此仍需要重启、重新连接等恢复处理。

COM 至今仍在现役

尽管常被视为「过时的技术」,但 COM 是 至今仍在 Windows 核心中持续被使用的机制

COM 出现的场景

  • 资源管理器扩展(右键菜单、预览显示)
  • Office 自动化(对 Excel、Word 的外部控制)
  • 与 .NET 的互操作(COM Interop)
  • 包含 ActiveX 的现有系统
  • DirectX、Windows Shell API 等众多 Windows API

即使认为「这和自己没关系」,只要从事 Windows 开发,COM 就一定会在某处出现

总结

我认为 COM 的美之所在,是 「独立于语言、进程与实现」。语言中立的接口设计、通过 GUID 实现的唯一识别与版本管理、通过 IUnknown 实现的引用计数,以及能够透明处理进程间通信的机制——这些无一例外,都是可以直接延伸到最新的组件化开发(REST API 的契约、微服务的接口分离等)的普适性思想。

共享相同标签的最新文章。可以围绕相近的主题进一步加深理解。

COM / ActiveX / OCX 是什么 - 区别与关系整理

从实务角度厘清 COM、ActiveX、OCX 三者的区别与关系:COM 是 Windows 组件互操作的二进制契约底层,ActiveX 是以 COM 为基础的可嵌入控件语境,OCX 则是 ActiveX 控件常见的扩展名。读完就能分清机制、组件、文件这三层边界。

常见问题

汇总了咨询这一主题时常见的问题。

COM 是什么?
COM(Component Object Model)是让 Windows 上的组件彼此交互的「二进制契约」。它是一种跨越语言与编译器差异,通过接口这种严格契约来通信的机制。其根本理念是「面向契约而非实现进行编程」的设计思想。
IUnknown 是什么?
IUnknown 是所有 COM 接口都会继承的基本接口。它提供三个功能:用于询问对象是否支持另一个接口的 QueryInterface、用于增加引用计数的 AddRef,以及用于减少引用计数、计数归零时销毁自身的 Release。COM 的对象生命周期管理正是建立在这个引用计数机制之上的。
COM 现在还在使用吗?
是的,COM 至今仍是在 Windows 核心中持续被使用的机制。它出现在资源管理器扩展(右键菜单、预览显示)、Excel 与 Word 的 Office 自动化、与 .NET 的 COM Interop、包含 ActiveX 的现有系统、DirectX 与 Windows Shell API 等众多场景中。只要从事 Windows 开发,COM 就一定会在某处出现。
COM 的优势是什么?
主要有四点:一是二进制兼容性,构建一次的组件可以不受编程语言或运行时限制地重用;二是接口分离,隐藏实现只公开契约;三是版本共存,通过添加新接口来保持向后兼容;四是通过 Out-of-proc COM(EXE 服务器)安全调用其他进程中的功能。

作者简介

本文作者的个人简介页面。

Go Komura

小村软件有限公司 代表

以 Windows 软件开发、技术咨询与故障排查为中心,擅长难以复现的故障调查,以及既有资产仍在运行的项目。

返回博客列表