什么是 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_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、注册、浏览器依赖、供应商维护等因素。
开发者的奇爱,或者我如何学会停止焦虑并爱上Windows
Windows很麻烦。但这种麻烦,恰恰是因为它是一个长年背负着现实业务的操作系统才会有的麻烦。
常见问题
汇总了咨询这一主题时常见的问题。
- 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 软件开发、技术咨询与故障排查为中心,擅长难以复现的故障调查,以及既有资产仍在运行的项目。