什么是 COM - 为什么 Windows COM 的设计至今依然优美
· 小村 豪 · COM, ActiveX, Windows 开发
更新记录(仅首版,2026年01月25日 发布)
- 首次发布
引用本文(DOI: 10.5281/zenodo.21615406)
本文保存于 Zenodo。以下同时提供始终指向最新版本的 DOI,以及固定于您正在阅读版本的 DOI。
小村 豪(2026)。《什么是 COM - 为什么 Windows COM 的设计至今依然优美》。小村软件有限公司。https://doi.org/10.5281/zenodo.21615406 https://comcomponent.com/zh-CN/blog/2026/01/25/001-why-com-is-beautiful/
- DOI(最新版本)
- 10.5281/zenodo.21615406
- DOI(此版本)
- 10.5281/zenodo.21615407
什么是 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_DISCONNECTED 或 RPC_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 的契约、微服务的接口分离等)的普适性思想。
相关文章
共享相同标签的最新文章。可以围绕相近的主题进一步加深理解。
委托开发 Windows 应用程序前该梳理的事项
在委托外包开发 Windows 应用程序之前,梳理现有软件改造、设备联动、COM/ActiveX、发布与更新、维护等需要注意的要点。
COM/OCX/ActiveX 开发中容易踩坑的注册与位数陷阱
本文从实务角度整理 COM、OCX、ActiveX 开发中容易踩坑的 32bit/64bit、Visual Studio 2022、regsvr32/Regasm、管理员权限、HKCR、STA/MTA 等问题。
COM / ActiveX / OCX 是什么 - 区别与关系整理
从实务角度厘清 COM、ActiveX、OCX 三者的区别与关系:COM 是 Windows 组件互操作的二进制契约底层,ActiveX 是以 COM 为基础的可嵌入控件语境,OCX 则是 ActiveX 控件常见的扩展名。读完就能分清机制、组件、文件这三层边界。
ActiveX / OCX 现在该如何处理 - 保留、封装、替换的判断表
本文整理发现 ActiveX / OCX 时应该选择保留、封装还是替换,涵盖 32bit / 64bit、注册、浏览器依赖、供应商维护等因素。
Arm 版 Windows 上业务应用能运行吗 ── x64 仿真(Prism)与原生 DLL・COM 的现实
面向开发者与信息系统部门,回答「Arm 版 Windows 上业务应用能运行吗」这一问题。梳理 x64 仿真(Prism)的原理、驱动程序等无法运行的层面、.NET 中 AnyCPU 与 P/Invoke 的组合问题,以及 Arm 适配自查清单。
相关主题
与本文相近的主题页面。以本文为起点,可以进一步了解相关服务和其他文章。
Windows 技术主题
汇整 KomuraSoft LLC 关于 Windows 开发、故障调查与既有资产活用文章的主题中心。
ActiveX 迁移
整理保留、包装或替换 COM / ActiveX / OCX 资产的阶段性判断的主题页面。
与本主题相关的服务
本文与以下服务页面相关联,欢迎从最接近的入口查看。
Windows 应用程序开发
支持包含常驻处理、设备联动、运行日志与可维护结构的 Windows 桌面应用程序。
既有资产活用 & 迁移支持
在持续活用 COM / ActiveX / OCX 资产、原生代码与 32 位依赖的同时,协助规划阶段性的迁移。
常见问题
汇总了咨询这一主题时常见的问题。
- 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 服务器)安全调用其他进程中的功能。