COM 元件是什麼?為什麼以前的網頁都愛用它?從原理到 C# 實作一次搞懂
前言
如果你曾經維護過舊版 Windows 系統、ASP Classic 網站、VB6 系統,甚至在 IIS 上部署過應用程式,很可能都聽過一個名詞:
COM(Component Object Model)
在 1990 年代到 2000 年代初期,COM 幾乎是 Windows 平台最重要的元件技術之一。
許多早期企業系統、ActiveX 控制項、Office 自動化功能,甚至 Internet Explorer 網頁,都大量依賴 COM 技術。
那麼 COM 到底是什麼?為什麼以前的網頁如此喜歡使用它?現在又為什麼逐漸消失了呢?
COM 是什麼?
COM(Component Object Model)是 Microsoft 所提出的一種軟體元件架構。
其目標是讓不同語言、不同程式甚至不同程序(Process)之間,可以互相呼叫功能。
簡單來說:
COM 是 Windows 上的「元件標準」。
只要遵守 COM 規範:
- C++ 可以呼叫 VB 撰寫的元件
- VB 可以呼叫 Delphi 撰寫的元件
- ASP 網頁可以呼叫 C++ DLL
- Office 可以呼叫第三方外掛
不需要知道對方使用什麼語言開發。
COM 解決了什麼問題?
在 COM 出現之前:
- C++ 寫的 DLL
- VB 寫的程式
- Delphi 寫的元件
彼此很難直接互動。
每種語言都有自己的:
- 物件模型
- 記憶體管理方式
- 函式呼叫規則
COM 提供了一套統一規範。
例如:
程式A
↓
COM介面
↓
程式B雙方只需要遵守 COM 規範即可互通。
COM 的核心概念
Interface(介面)
COM 並不是直接暴露類別。
而是透過 Interface 存取功能。
例如:
interface ICalculator
{
Add();
Subtract();
}使用者只能透過介面呼叫功能。
GUID
每個 COM 元件都擁有唯一識別碼。
例如:
6BF52A52-394A-11D3-B153-00C04F79FAA6這稱為:
GUID(Globally Unique Identifier)
Windows 透過 GUID 找到對應元件。
Registry
COM 元件安裝後會註冊到 Windows Registry。
常見位置:
HKEY_CLASSES_ROOT因此常聽到:
regsvr32 xxx.dll就是在註冊 COM 元件。
為什麼以前網頁很喜歡使用 COM?
答案其實很簡單:
因為瀏覽器能力太弱
早期 HTML 僅能顯示:
- 文字
- 圖片
- 超連結
無法:
- 掃描身分證
- 操作印表機
- 存取本機檔案
- 使用攝影機
- 呼叫銀行讀卡機
因此 Microsoft 推出了:
ActiveX
而 ActiveX 本質上就是 COM 元件。
ActiveX 的運作方式
Internet Explorer 可以下載 COM 元件。
例如:
<object
classid="clsid:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX">
</object>瀏覽器發現後:
- 下載 ActiveX
- 註冊 COM
- 執行本機程式碼
於是網頁就能:
- 讀取 IC 卡
- 掃描文件
- 操作印表機
- 上傳檔案
這在當時非常強大。
COM 的優點
語言無關
支援:
- C++
- VB
- Delphi
- C#
可重複使用
寫一次元件。
多個程式可共用。
效能高
大多數 COM 使用原生程式碼。
執行速度快。
COM 的缺點
註冊地獄(DLL Hell)
不同版本 DLL 容易衝突。
例如:
程式A需要 v1
程式B需要 v2安裝後常互相覆蓋。
部署複雜
需要:
regsvr32進行註冊。
安全性問題
ActiveX 可以直接執行本機程式碼。
惡意網站可能:
- 刪除檔案
- 安裝病毒
- 竊取資料
因此成為資安風險來源。
為什麼現在很少用了?
現代瀏覽器已經具備:
- HTML5
- JavaScript
- WebAssembly
- WebUSB
- WebRTC
許多原本需要 COM 的功能都能透過標準 Web API 完成。
此外:
- Chrome 不支援 ActiveX
- Firefox 不支援 ActiveX
- Edge 已淘汰 ActiveX
因此 COM 在 Web 領域逐漸退出舞台。
但在 Windows 系統內部仍然大量存在。
例如:
- Office 自動化
- Windows Shell
- WMI
- IIS
仍持續使用 COM 技術。
C# 呼叫 COM 元件範例
以下範例示範呼叫 Windows Media Player COM 元件。
using WMPLib;
class Program
{
static void Main()
{
WindowsMediaPlayer player =
new WindowsMediaPlayer();
player.URL = @"C:\Music\Test.mp3";
player.controls.play();
Console.ReadLine();
}
}安裝 COM Reference 後即可使用。
Visual Studio:
Project
└ Add Reference
└ COM
└ Windows Media Player使用 COM 建立 Excel
另一個常見案例是 Office Automation。
using Excel = Microsoft.Office.Interop.Excel;
class Program
{
static void Main()
{
var excel = new Excel.Application();
excel.Visible = true;
var workbook = excel.Workbooks.Add();
var sheet =
(Excel.Worksheet)workbook.Sheets[1];
sheet.Cells[1, 1] = "Hello COM";
workbook.SaveAs(@"C:\Temp\Test.xlsx");
}
}這其實也是透過 COM 與 Excel 溝通。
結論
COM 是 Microsoft 在 Windows 平台上最成功也最重要的元件技術之一。
它解決了不同語言、不同程式之間的互通問題,也造就了 ActiveX、Office 自動化以及大量企業系統的發展。
雖然現代 Web 技術已逐漸取代 COM 在瀏覽器中的角色,但在 Windows 核心架構、Office、WMI、IIS 等領域中,COM 至今仍扮演重要角色。
理解 COM,不僅能幫助我們維護舊系統,也能更深入理解 Windows 底層元件化架構的設計思想。
留言
張貼留言