什麼是 COM - 為什麼 Windows COM 的設計至今依然優雅
· 更新日期: · 小村 豪 · COM, ActiveX, Windows 開發
更新紀錄(僅初版,2026年01月25日 發布)
- 初次發布
引用本文(DOI: 10.5281/zenodo.21616229)
本文保存於 Zenodo。以下同時提供一律指向最新版本的 DOI,以及固定於您正在閱讀版本的 DOI。
小村 豪(2026)。〈什麼是 COM - 為什麼 Windows COM 的設計至今依然優雅〉。小村軟體有限公司。https://doi.org/10.5281/zenodo.21616229 https://staging.comcomponent.com/zh-TW/blog/2026/01/25/001-why-com-is-beautiful/
- DOI(最新版本)
- 10.5281/zenodo.21616229
- DOI(此版本)
- 10.5281/zenodo.21616230
什麼是 COM - 為什麼 Windows COM 的設計至今依然優雅
COM 常被認為是老技術,但在 Windows 開發中,它至今仍會作為設計核心反覆出現。
特別是在搜尋中常見的疑問是:COM 是什麼、為什麼需要 IUnknown 和 GUID、以及為什麼到現在仍會被討論。
什麼是 COM?
COM(Component Object Model)是 讓 Windows 上的元件彼此互動的「二進位契約」。
它能跨越語言與編譯器差異,透過「介面」這種嚴格契約來通訊。
理解 COM 時,以下元素尤其重要。
- 以介面為中心的設計(契約先於實作)
- 透過 GUID(CLSID / IID) 進行識別
- 透過 IUnknown 進行參考計數與介面探索
- 不僅能以 DLL(In-Process) 形式運作,也可作為 EXE(Out-of-Process) 運作
簡單說,COM 被設計成「不需要知道實作細節也能重用的機制」。語言中立的介面,這個概念真的非常優雅。
COM 的強項
COM 看似老舊,但在設計上有許多至今仍被高度評價的優勢。
-
二進位相容性
已編譯完成的元件,不受語言或執行階段限制即可重用。 -
介面分離
隱藏實作、只公開契約,可形成更穩健且可維護的設計。 -
可共存多版本
為了在不破壞相容性的前提下擴充功能,基本做法是新增新介面。很有 Microsoft 風格。 -
可跨行程重用
透過 Out-of-Process COM,可以安全呼叫其他行程的功能。
這種「獨立於語言、行程與實作」的特性,就是我認為 COM 優雅的地方。
COM 至今仍在第一線
COM 常被貼上「老技術」標籤,但它其實是 至今仍在 Windows 核心中被使用的機制。
在與既有資產整合,或使用 Windows 特有功能時,COM 依然是重要選項。
COM 出現的意外場景
- 檔案總管擴充(右鍵選單與預覽)
- Office 自動化(外部控制 Excel / Word)
- 與 .NET 互通(COM Interop)
- 包含 ActiveX 的既有系統
即使你覺得「現在工作和它無關」,只要做 Windows 開發,COM 幾乎一定會在某處出現。
也正因此,理解 COM 的設計思想非常值得。
相關文章
共用相同標籤的最新文章。能以相近的主題延伸理解。
委外・委託開發 Windows 應用程式前該整理的事項
在委外・委託開發 Windows 應用程式之前,整理既有軟體改版、設備整合、COM/ActiveX、發布與更新、維護等應留意的重點。
開發 COM 元件、OCX/ActiveX 時常見的坑 - 整理 Visual Studio 的 32bit/64bit、註冊、管理員權限
整理開發 COM、OCX、ActiveX 元件時最容易卡關的四個面向:宿主行程的 32bit/64bit、Visual Studio 2022 變成 64bit 後的設計時整合、regsvr32 與 Regasm 的註冊位置、以及管理員權限與 HKCU/HKLM 的關係,協...
COM / ActiveX / OCX 是什麼 - 差異與關係一次整理
從實務角度釐清 COM、ActiveX、OCX 三者的差異與關係:COM 是 Windows 元件互動的 binary 契約底層,ActiveX 是以 COM 為基礎的可嵌入 control 脈絡,OCX 則為 ActiveX control 常見的副檔名。讀完能分清機制、...
ActiveX / OCX 現在如何處理 - 保留・包裝・取代的判斷表
整理在實務專案中遇到 ActiveX 或 OCX 時的判斷流程,從 UI 部件、機器控制、報表、瀏覽器依賴到 32bit 與 64bit 的牆壁,依照保留・包裝・取代三種選項列出對照表與決策流程,並說明註冊發佈與 STA 等容易絆倒的細節,幫讀者選出最低成本的下一步。
開發者的奇愛,或者我如何學會停止憂慮並愛上Windows
Windows很麻煩。但這種麻煩,正是因為它是一個長年背負著現實業務的作業系統才會有的麻煩。
相關主題
與本文相近的主題頁面。以本文為起點,可進一步連到相關服務與其他文章。
Windows 技術主題
彙整 KomuraSoft LLC 關於 Windows 開發、故障調查與既有資產活用文章的主題中心。
ActiveX 遷移
整理保留、包裝或替換 COM / ActiveX / OCX 資產的階段性判斷的主題頁面。
與本主題相關的服務
本文連結到以下服務頁面,歡迎從最接近的入口查看。
Windows 應用程式開發
支援包含常駐處理、設備連動、運作日誌與可維護結構的 Windows 桌面應用程式。
既有資產活用 & 遷移支援
在持續活用 COM / ActiveX / OCX 資產、原生程式碼與 32 位元相依的同時,協助規劃階段性的遷移。
常見問題
整理諮詢這個主題時常見的問題。
- COM 是什麼?
- COM(Component Object Model)是讓 Windows 上的元件彼此互動的「二進位契約」。它能跨越語言與編譯器差異,透過介面這種嚴格契約來通訊。核心元素包括以介面為中心的設計、以 GUID(CLSID/IID)進行識別,以及透過 IUnknown 進行參考計數與介面探索。簡單說,COM 被設計成不需要知道實作細節也能重用的機制。
- COM 現在還有人在用嗎?
- 有。COM 至今仍在 Windows 核心中被使用,並不是只剩歷史意義的老技術。檔案總管的右鍵選單與預覽擴充、Office 自動化(外部控制 Excel/Word)、.NET 的 COM Interop、含 ActiveX 的既有系統等場景都會用到它。只要做 Windows 開發,COM 幾乎一定會在某處出現。
- COM 有哪些設計上的優點?
- 主要有四點。第一是二進位相容性,已編譯完成的元件不受語言或執行階段限制即可重用;第二是介面分離,隱藏實作、只公開契約,形成更穩健且可維護的設計;第三是可共存多版本,透過新增新介面在不破壞相容性的前提下擴充功能;第四是可跨行程重用,透過 Out-of-Process COM 安全呼叫其他行程的功能。
- 為什麼 COM 需要 IUnknown 和 GUID?
- GUID(CLSID/IID)用來唯一識別元件類別與介面,IUnknown 則負責參考計數與介面探索。COM 以介面這種嚴格契約通訊,契約先於實作,因此需要這兩個機制來支撐「不需要知道實作細節也能重用」的設計。COM 元件除了以 DLL(In-Process)形式運作,也可作為 EXE(Out-of-Process)運作。