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>

瀏覽器發現後:

  1. 下載 ActiveX
  2. 註冊 COM
  3. 執行本機程式碼

於是網頁就能:

  • 讀取 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 底層元件化架構的設計思想。

留言

熱門文章