COM / ActiveX / OCX 是什麼 - 差異與關係一次整理

· 更新日期: · · COM, ActiveX, OCX, OLE, Windows 開發, Legacy 技術

更新紀錄(2 筆,最後更新 2026年09月04日)

本文的修改紀錄。已保存的更新前版本,可透過附有 DOI 的永久連結閱讀。

已將繁體中文版改寫為日文原文的完整翻譯。先前的繁體中文版只譯出日文原文的一部分,遺漏了章節、表格、Mermaid 圖、圖說與 FAQ。本次依日文原文將這些內容全部補回,並新增本文的知識地圖章節。技術主張與日文版一致。 查看更新前的版本 (DOI: 10.5281/zenodo.22279372)
補上了日文原文中已有的諮詢引導(consultation_services)。內文沒有改動。 查看更新前的版本 (DOI: 10.5281/zenodo.21616270)
初次發布
引用本文(DOI: 10.5281/zenodo.21616269)

本文保存於 Zenodo。以下同時提供一律指向最新版本的 DOI,以及固定於您正在閱讀版本的 DOI。

Go Komura(2026)。〈COM / ActiveX / OCX 是什麼 - 差異與關係一次整理〉。小村軟體有限公司。https://doi.org/10.5281/zenodo.21616269 https://comcomponent.com/zh-TW/blog/2026/03/13/000-what-is-com-activex-ocx/

DOI(最新版本)
10.5281/zenodo.21616269
DOI(此版本)
10.5281/zenodo.22297102

COM / ActiveX / OCX 這 3 個詞,在 Windows 的舊系統案子裡幾乎都是成套出現。

  • 廠商寄來一個 .ocx
  • Access 或 VB6 的畫面上放著來路不明的元件
  • 剛聽到「這是 COM」,下一句就變成「這是 ActiveX 吧」
  • 接著 regsvr32、32bit / 64bit、IE 模式這些詞一起湧上來

走到這一步,對話通常就對不上了。原因是這些術語彼此很接近,歷史上的重疊也很大。 反過來說,只要能把這幾個分開理解,調查、遷移與說明的難度都會差很多。

對話對不上的結構COM、ActiveX、OCX 這些相近的術語在同一個現場一起出現時對話就會對不上,但只要分清楚哪個是底層、哪個是元件、哪個是檔案,調查、遷移與說明都會變得容易的圖。3 個詞一起冒出來對話對不上分成底層、元件、檔案調查、遷移與說明都變輕鬆

圖 1: 這篇文章的目的只有一個:分清楚「哪個是底層、哪個是元件、哪個是檔案」。

本文會依照能看出差異與關係的順序,梳理 什麼是 COM、什麼是 ActiveX、什麼是 OCX。 特別要講清楚的是 哪個是底層、哪個是元件、哪個是檔案。

目錄

  1. 先給結論(一句話)
  2. 本文所說的 COM / ActiveX / OCX
  3. 先用一張圖整理
    • 3.1. 關係圖
    • 3.2. 術語的最短整理
  4. 什麼是 COM
    • 4.1. 一句話說明
    • 4.2. COM 裡重要的東西
    • 4.3. 術語的一行筆記
  5. 什麼是 ActiveX
    • 5.1. 一句話說明
    • 5.2. ActiveX 不是瀏覽器專用
  6. 什麼是 OCX
    • 6.1. 一句話說明
    • 6.2. 和 .dll 有什麼不同
  7. 用表格整理差異
  8. 過去用在哪些地方
  9. 為什麼容易混淆
  10. 現在的實務該怎麼看待
  11. 常見的誤解
  12. 調查時的檢查重點
  13. 總結
  14. 參考資料

圖中實線表示始終成立的關係,虛線表示附帶條件的關係(成立條件寫在詳細頁面中各關係的說明中)。關係的完整清單(共 18 條,附依據與可信度)以及主要概念的定義,彙整在知識地圖詳細頁面(日文)。資料:JSON-LD / Turtle

1. 先給結論(一句話)

先給一個粗略但派得上用場的講法。

  • COM 是底層。它是 Windows 上元件彼此往來所依據的二進位契約
  • ActiveX 是以 COM 為基礎的元件脈絡,尤其常以嵌入宿主使用的控制項形式出現
  • OCX 是 ActiveX 控制項常見的實作檔案,以副檔名的形式遇到
  • 也就是說,用 COM = 機制、ActiveX = 元件的脈絡、OCX = 檔案 這種程度來理解就會清楚很多
  • 「ActiveX = 舊瀏覽器上那個危險的東西」這個印象對了一半,另一半不夠。ActiveX 並不是瀏覽器專用
  • 「OCX = ActiveX」在口語裡幾乎被當成同義詞,但嚴格來說是把概念和副檔名混在一起
  • 現在不會把它擺在新開發的主位,不過既有的 Windows 應用程式、Office、Access、設備 SDK、公司內部 Web 裡還是會遇到

一開始就從把這 3 件事分開來看著手。

  1. 這是 COM 的話題嗎
  2. 這是 ActiveX 控制項的話題嗎
  3. 還是只是 看到 .ocx 檔案就這樣叫

只要這裡分得開,迷霧就會散掉不少。

一開始要先分開的 3 個問題從分辨眼前談的是 COM 這個機制、還是 ActiveX 控制項這個元件、還是只是看到 ocx 檔案就這樣叫開始著手的圖。現在談的到底是什麼COM = 機制的話題ActiveX = 元件脈絡的話題OCX = 檔案的話題

圖 2: 猶豫的時候就回到這 3 選 1。COM 是機制,ActiveX 是元件的脈絡,OCX 是檔案。

2. 本文所說的 COM / ActiveX / OCX

這 3 個詞在實務上常常草率地混住在一起。 所以本文先把意義固定下來。

  • COM:Windows 的元件模型本身。介面、GUID、註冊、呼叫的底層
  • ActiveX:以 COM 為基礎、可嵌入的控制項,以及使用它的脈絡。實務上尤其常指 ActiveX 控制項
  • OCX:ActiveX 控制項實作常見的副檔名,也就是 .ocx

稍微補充一下,歷史上 ActiveX 這個詞曾經有一段時期用得更寬。 不過現在實務上講 ActiveX 會出問題的地方,多半集中在 控制項、嵌入、宿主、瀏覽器、註冊 這一帶。

所以本文基本上也把 ActiveX 當成偏向 ActiveX 控制項的話題 來談。

ActiveX 這個詞的範圍與本文的焦點歷史上 ActiveX 這個詞曾經用得更寬,但現在實務上會出問題的是控制項、嵌入、宿主、瀏覽器與註冊一帶,所以本文把焦點鎖定在偏向控制項的話題上的圖。ActiveX 這個詞歷史上也有更寬的意思現在會出問題的是控制項周邊本文以控制項這一側為主嵌入、宿主、瀏覽器、註冊

圖 3: 承認這個詞在歷史上的寬度,同時把焦點固定在實務上會出問題的「控制項這一側」。

3. 先用一張圖整理

3.1. 關係圖

先用一張圖看整體會比較快。如果所在環境顯示不出圖,圖正下方的條列寫的是同樣的內容,可以直接讀那裡。

COM二進位契約的底層OLE / Automation嵌入與自動化的機制ActiveX以 COM 為基礎的控制項脈絡ActiveX 控制項OCX (.ocx)實作檔案常見的形式宿主 / 容器IE / Access / VB6 / MFC / WinForms

圖 4: 以 COM 為底層,OLE / Automation、ActiveX、OCX 層層疊上去,宿主再載入控制項的關係圖。

這裡重要的是 COM 和 ActiveX 不是同一個詞 這一點。

  • COM 是底層
  • OLE / Automation 是為了嵌入與自動化而存在的機制
  • ActiveX 是在其上被使用的控制項脈絡
  • OCX 是那個控制項實作常見的檔案

所以被問到 ActiveX 就是 COM 嗎,答案會是 底層是 COM,但 ActiveX 不是 COM 本身。

3.2. 術語的最短整理

詞彙 先這樣理解
COM 機制、契約、底層
ActiveX 以 COM 為基礎的嵌入式元件脈絡
ActiveX 控制項 實際放到宿主上的元件本體
OCX ActiveX 控制項常見的副檔名
OLE / Automation 嵌入、自動化與介接的機制

如果要用最短的方式記,這樣就夠了。

  • COM 是機制
  • ActiveX 是元件的脈絡
  • OCX 是檔案

4. 什麼是 COM

4.1. 一句話說明

COM 是 Component Object Model 的縮寫,是 Windows 上元件彼此往來所依據的 二進位契約。

這裡說的二進位契約,指的不是原始碼的方便性或語言規格,而是 編譯之後的形式仍然守得住約定的介面。 用 C++ 做出來的元件可以從別的語言或別的應用程式使用,靠的就是這份契約。

貼近實務感覺來說,COM 與其說是 一種方便的函式庫散發方式,不如說是 隱藏實作、只用契約來串接的機制。

舉例來說,下面這些就是 COM 的典型(每個詞的意思在 4.3 各用一行整理)。

  • 由 IUnknown 提供的參考計數
  • 由 QueryInterface 進行的介面探詢
  • 以 IID、CLSID 這類 GUID 為基礎的識別
  • 透過 DLL 的處理程序內使用
  • 透過 EXE 的處理程序外使用

總之,COM 是 Windows 元件化文化的底層。

二進位契約這個想法COM 不看原始碼或語言規格的方便性,而是用編譯之後仍然守得住的約定也就是二進位契約來串接元件,所以用 C++ 做出來的元件可以從別的語言或別的應用程式使用的圖。元件〔隱藏實作〕二進位契約〔對外公開的約定〕別的語言、別的應用程式編譯之後約定依然守得住

圖 5: COM 的核心是「隱藏實作,只用契約來串接」。所以元件才能跨越語言被使用。

4.2. COM 裡重要的東西

只抓基本的話,COM 裡下面這幾點很重要。

  • 以介面為中心
    • 先決定要公開什麼,才談實作
  • 用 GUID 識別
    • 讓類別與介面能被唯一識別
  • 宿主與實作分離
    • 呼叫端不需要知道內部實作
  • 可以跨處理程序
    • 不只同一個處理程序,也能當成別的處理程序裡的元件來用

這幾點就是 COM 不會只被當成一個老技術的原因。 從相當早的年代開始,它就穩穩地帶著 以契約為基礎來重複使用的設計。

COM 裡重要的 4 根支柱以介面為中心的設計、用 GUID 做唯一識別、宿主與實作分離、可以跨處理程序這 4 點,讓 COM 成為以契約為基礎的重複使用設計的圖。COM 的基本以介面為中心用 GUID 識別宿主與實作分離可以跨處理程序

圖 6: 撐起 COM 的 4 根支柱。從很早的年代就帶著以契約為基礎的重複使用設計。

4.3. 術語的一行筆記

談 COM 的時候,下面這些詞會不加說明地飛過來。這裡當成概念的入口,先各用一行抓住就好。想再往設計層面的趣味走的讀者,可以看 什麼是 COM - Windows COM 的設計為何至今依然優美。

術語 一行說明
介面 元件承諾「這些可以呼叫」的一串函式。它和實作是分開的
IUnknown 所有 COM 介面的共同底層介面。只有 QueryInterface / AddRef / Release 這 3 個成員
QueryInterface 用來問手上的元件「你也有這個介面嗎」的方法。有的話就會傳回那個指標
參考計數 計算使用者數量的計數器。AddRef 讓它增加,Release 讓它減少,歸零的那一刻元件就被釋放
GUID Globally Unique Identifier 的縮寫,寫成 {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} 形式的 128 bit 識別碼。用來避免名稱衝突
CLSID Class ID 的縮寫,指出「是哪個元件(類別)」的 GUID。登錄檔裡的註冊也是用這個值去查
IID Interface ID 的縮寫,指出「是哪個介面」的 GUID
ProgID 給人看的 CLSID 別名。像 Excel.Application 這樣的字串,讓指令碼之類的地方可以指名元件
Type Library 把元件公開的介面與方法的型別資訊集中起來的資料。VB6 或 .NET 要參考元件時會讀它
Apartment(STA / MTA) COM 的執行緒規矩。STA 是「這個元件只能從 1 條執行緒呼叫」,MTA 是「可以由多條執行緒同時呼叫」,UI 元件幾乎都在 STA 這一側

本文只做到概念的整理,不深入各項目的細節。等到需要談實作的時候,把這張表裡的詞直接當成搜尋關鍵字,就比較容易先鎖定可疑範圍。

以 IUnknown 為底層的基本動作身為所有 COM 介面底層的 IUnknown,具備用 QueryInterface 詢問別的介面、用 AddRef 與 Release 增減參考計數、歸零時釋放元件這些基本動作的圖。IUnknown〔一切的底層〕用 QueryInterface 詢問有的話就傳回指標用 AddRef 與 Release 管理數量歸零就釋放元件

圖 7: 位在術語表中心的 IUnknown 那 3 個方法,分成「詢問」與「計數」兩件工作。

5. 什麼是 ActiveX

5.1. 一句話說明

ActiveX 理解成以 COM 為基礎的 可重複使用軟體元件,尤其是 嵌入宿主或容器裡使用的控制項,會比較好懂。

實務上講 ActiveX,相當高的機率談的是 ActiveX 控制項。 例如按鈕、表格、圖表、日曆、檢視器、設備介接元件這類東西。

與其把 ActiveX 當成 獨自站著、架子很大的龐大技術,不如把它看成 嵌在某個宿主裡工作的元件,比較不容易失準。

嵌在宿主裡工作的元件實務上講 ActiveX 相當高的機率談的是 ActiveX 控制項,也就是按鈕、表格、圖表、檢視器、設備介接元件這類嵌在宿主或容器裡工作的元件的圖。宿主 / 容器ActiveX 控制項表格或日曆檢視器或設備介接元件不是獨自站著的龐大技術

圖 8: 把 ActiveX 當成「嵌進去才工作的元件」來看,就不容易失準。

5.2. ActiveX 不是瀏覽器專用

ActiveX = Internet Explorer 那個東西 的印象相當強。 這並沒有錯,但 不只是這樣。

列一下 ActiveX 控制項一路被用在哪些地方。

  • Access 表單
  • VB6(Visual Basic 6.0)應用程式
  • MFC(Microsoft Foundation Class 函式庫)的容器
  • Office 與 VBA 周邊
  • 從 WinForms 使用的 COM 包裝層
  • Internet Explorer 以及它的相容運作脈絡

也就是說,ActiveX 是 不限於瀏覽器,在 Windows 應用程式這一側也長期被使用的元件技術。

不理解這一點,就會把公司內部 Web 上找到的 ActiveX,和埋在 Access 畫面裡的 ActiveX 看成兩種東西。 實際上兩者都是相當靠近 COM 的親戚。

ActiveX 控制項一路被用在哪些地方Access 表單、VB6 應用程式、MFC 的容器、Office 與 VBA 周邊、從 WinForms 使用的 COM 包裝層以及 Internet Explorer,說明 ActiveX 不是瀏覽器專用而是在 Windows 應用程式這一側也長期被使用的圖。ActiveX 控制項Access、VB6、MFCOffice 與 VBA 周邊WinForms 的 COM 包裝層Internet Explorer 系出名的只有這裡

圖 9: 只是在 IE 上比較顯眼,實際用過的地方大半在 Windows 應用程式那一側。

6. 什麼是 OCX

6.1. 一句話說明

OCX 是 實作 ActiveX 控制項時常用的副檔名。 在 Windows 的實務現場看到 .ocx,第一個可以懷疑的就是 嵌入式控制項那一類的 COM 元件。

會冒出來的場合大致是這幾種。

  • 廠商 SDK 的散發檔案
  • VB6 / Access / MFC 的舊專案
  • 安裝程式裡要註冊的檔案
  • 需要 regsvr32 的元件

要記住的是 OCX 是檔案的形式,不是概念本身 這一點。 所以要草率地回答 OCX 是什麼,答案就是 常以 ActiveX 控制項實體身分遇到的檔案。

6.2. 和 .dll 有什麼不同

這裡也很容易混淆。

  • .ocx 相當強烈地暗示它是 ActiveX 控制項
  • .dll 可能是一般的函式庫,可能是 COM 伺服器,也可能是 ActiveX 周邊的相依 DLL

看到 .ocx 幾乎就能先鎖定「偏向 ActiveX 的話題」,但只看到 .dll 還不知道它是什麼身分。

實務上常見的是像這樣排在一起,

  • vendorcontrol.ocx
  • vendorhelper.dll
  • vendorcore.dll

也就是 主角是 OCX,旁邊由 DLL 支撐 的樣子。

所以被問到 OCX 算不算 DLL 的一種,感覺上是接近的,但在調查的場合 把角色分開來看 比較安全。

副檔名能透露的資訊差距ocx 強烈暗示它是 ActiveX 控制項,dll 則還分不出是一般函式庫、COM 伺服器還是相依 DLL,實務上常見主角 OCX 由旁邊的 DLL 支撐的組合的圖。.ocx.dll副檔名是什麼幾乎可以鎖定在偏 ActiveX 這一側還不知道是什麼身分是函式庫、COM 伺服器還是相依項主角 OCX 由旁邊的 DLL 支撐的形式

圖 10: .ocx 可以先鎖定範圍,.dll 則在查清角色之前不知道是什麼身分。

7. 用表格整理差異

詞彙 是什麼 實務上常見的字眼 常見的實體
COM 元件模型,二進位契約的底層 IUnknown、QueryInterface、CLSID、IID、Apartment .dll、.exe、註冊資訊
ActiveX 以 COM 為基礎的控制項脈絡 容器、嵌入、屬性、事件 ActiveX 控制項
ActiveX 控制項 實際被放上去的可重複使用元件 表格、日曆、檢視器、設備介接 .ocx、.dll
OCX ActiveX 控制項常見的副檔名 regsvr32、工具箱、32bit / 64bit xxx.ocx
OLE / Automation 嵌入與自動化的機制 Office 介接、屬性頁、自動化 以 COM 為基礎的各種功能

如果要靠這張表來記,先這樣就好。

  • COM 是基礎工程
  • ActiveX 是疊在其上的元件文化
  • OCX 是在現場撿到的檔案

8. 過去用在哪些地方

ActiveX / OCX 因為瀏覽器的記憶太強,很容易被看成 舊時代的 Web 技術。 不過實際上它用得更廣。

具體來說是這些地方。

  • 桌面應用程式
    • VB6
    • MFC / C++
    • Access 表單
    • Office 與 VBA 周邊
  • 瀏覽器與公司內部 Web
    • 嵌在 Internet Explorer 裡的檢視器
    • 簽章元件
    • 檔案傳輸元件
    • 周邊設備介接元件
  • 既有的 .NET 應用程式
    • 從 WinForms 包起來使用的既有 ActiveX 控制項
    • 把既有 COM 資產當成 UI 元件延續使用的情況

繞了一圈,還是回到 ActiveX 不是網際網路專用 這件事。 只是因為在 IE 上太搶眼才看起來像 Web 技術,實際上把它看成 Windows 的嵌入式元件技術,在實務上比較貼切。

外界印象與實際情況的落差因為在 IE 上太搶眼,ActiveX 很容易被看成舊時代的 Web 技術,但實際上桌面應用程式、公司內部 Web、既有 .NET 應用程式都在用,本質是 Windows 的嵌入式元件技術的圖。在 IE 上搶眼的記憶看起來像舊時代的 Web 技術實際使用的地方桌面應用程式瀏覽器與公司內部 Web既有的 .NET 應用程式實際上是 Windows 的嵌入式元件技術

圖 11: 「舊時代的 Web 技術」這種印象,和「Windows 的嵌入式元件技術」這個實際情況之間的落差。

9. 為什麼容易混淆

9.1. 詞彙的層級不同,卻出現在同一段對話裡

  • COM 談的是 底層
  • ActiveX 談的是 元件的脈絡
  • OCX 談的是 檔案

層級本來就不同,實務上卻在同一個現場同時冒出來,對話自然容易變得一團亂。

9.2. ActiveX 這個詞的範圍稍微寬一點

COM 的意思相對固定。 相對地,ActiveX 不論在歷史上或實務上,用得都稍微寬一點。

不同的人指的可能是,

  • 控制項本身
  • .ocx 檔案
  • 在 IE 上跑的舊元件
  • 以 COM 為基礎的嵌入式元件的統稱

到底是哪一個,人跟人之間會錯開。 到這個時候,對話已經對不上了。

9.3. 一看到 .ocx 就想把全部都叫成 ActiveX

這種心情可以理解。 平常這樣講大致上也通。

不過在遷移或調查的場合,

  • 它是不是 UI 元件
  • 它在哪個宿主上跑
  • 需不需要註冊
  • 32bit / 64bit 的狀況是什麼
  • 有沒有瀏覽器相依性

不分開來看的話,後面一定會出事。

造成混淆的 3 個理由層級不同的話題出現在同一段對話、ActiveX 這個詞的範圍稍寬、一看到 ocx 就想把全部都這樣叫,這 3 點造成混淆的圖。層級不同的話題出現在同一段對話對話變得一團亂ActiveX 這個詞範圍很寬看到 ocx 就全部這樣叫在遷移與調查的場合會出事

圖 12: 混淆的真面目,是底層、元件、檔案這 3 個不同層級同時出現在同一個現場。

10. 現在的實務該怎麼看待

首先,找到 COM / ActiveX / OCX 並不代表要立刻全盤否定。 但是把全部都用同樣的認真程度對待,也很危險。

瀏覽器側的 ActiveX 相依性

這一側優先用比較嚴格的眼光看會比較安全。

  • 它不是現代瀏覽器開發的主流
  • 在相容運作的脈絡下會談到 IE 模式,但這比較適合看成 為了向下相容而搭的橋
  • 不建議把它握成新專案的前提技術

判斷時也需要時間軸。IE11 桌面應用程式已經退役,現在剩下的立足點是 Microsoft Edge 的 IE 模式。關於這個 IE 模式,Microsoft 提出的方針是 至少支援到 2029 年,若要終止則提前 1 年公告。也就是說,2029 年不是「可以放著不管到那時候的期限」,而是 要在那之前拆完的期限,應該從那裡倒推回來安排。拆除的步驟本身另外寫在 擺脫 IE 模式依賴系統的實務指南 裡。

Web 側的 ActiveX 與其想「怎麼延續使用」,不如想「要從哪裡開始拆」,這樣比較實際。

瀏覽器側 ActiveX 的時間軸IE11 桌面應用程式已經退役,剩下的立足點是 Edge 的 IE 模式,Microsoft 提出至少支援到 2029 年並在終止時提前 1 年公告的方針,因此 2029 年不是可以放著不管的期限而是要倒推安排的拆完期限的圖。IE11 桌面版已經退役剩下的立足點是 Edge 的 IE 模式至少支援到 2029 年當成拆完的期限倒推安排若要終止會提前 1 年公告的方針

圖 13: 2029 年不是寬限,而是截止日。瀏覽器側要用「從哪裡開始拆」來思考。

桌面側的 ActiveX / OCX 相依性

這一側可以判斷得更務實一些。

  • 在既有宿主裡穩定運轉
  • 散發對象有限
  • 廠商維護或自家維護有著落
  • 註冊、相依 DLL、位元數的前提都掌握得住

這些條件都齊的話,保留 是很正常的判斷。

另一方面,

  • 想把 32bit OCX 直接載進 64bit 那一側
  • 只想把周邊改成 .NET
  • 每次散發與註冊都出包
  • 還留著瀏覽器相依性

這種情況下,把 保留 / 包起來 / 取代 分開考慮比較安全。

現在的實務要問的不是 是不是因為是 ActiveX 所以就是壞的,而是 要把邊界劃在哪裡。 與其看成老技術,不如當成 既有系統的接合面,會比較好處理。

桌面側的判斷會怎麼分岔穩定運轉、散發範圍有限、維護有著落、前提都掌握這些條件都齊的話保留是很正常的判斷,若有位元數衝突、周邊要改成 .NET、散發出包或瀏覽器相依,就把保留、包起來、取代分開考慮的圖。穩定運轉且前提都掌握有卡關的地方條件是否都齊了保留也是很正常的判斷把保留、包起來、取代分開當成接合面思考要把邊界劃在哪

圖 14: 桌面側要分開認真程度來判斷。要問的不是好壞,而是邊界的位置。

11. 常見的誤解

誤解 1:COM = ActiveX

不對。 COM 是底層,ActiveX 是在其上被使用的控制項脈絡。

誤解 2:ActiveX = Internet Explorer

不對。 它在 IE 上出名確實是事實,但 ActiveX 不是瀏覽器專用。

誤解 3:ActiveX = OCX

實務上這兩個詞用得相當接近,但嚴格來說不一樣。 ActiveX 談的是脈絡或元件,OCX 則是以副檔名形式遇到的實體。

誤解 4:OCX 不就是普通的 DLL 嗎

草率地說是接近的,不過在調查的時候最好別這麼草率。 光看 .dll 讀不出角色,.ocx 則帶著相當偏向控制項的味道。

誤解 5:COM 已經是死掉的技術

至少在 Windows 的世界裡,這樣講太粗暴了。 它只是從舞台前緣往後退了一點,在設計與互通的脈絡裡現在仍然會出現。

常見誤解該怎麼糾正COM 不是 ActiveX 本身而是底層、ActiveX 不是 IE 專用、ActiveX 與 OCX 是概念與檔案的差別、COM 不是死掉的技術,整理這些誤解該怎麼糾正的圖。COM = ActiveX ?COM 是底層,兩者不同ActiveX = IE 專用 ?桌面上仍在服役ActiveX = OCX ?概念與檔案的差別COM 死了 ?互通的場合現在也會出現

圖 15: 這 5 個誤解都來自同一個地方:把層級的差別混在一起。

12. 調查時的檢查重點

找到 COM / ActiveX / OCX 之後,照下面的順序逐一查看,就不容易迷路。

  1. 它是什麼元件
    • 是 UI 控制項嗎
    • 是檢視器嗎
    • 是設備介接嗎
    • 是 Office / Access 介接嗎
  2. 它在哪裡執行
    • 是 Access / VBA 嗎
    • 是 VB6 / MFC 嗎
    • 是 WinForms 嗎
    • 是 IE / IE 模式嗎
  3. 檔案與識別碼是什麼
    • .ocx / .dll / .exe
    • ProgID
    • CLSID
    • Type Library
  4. 註冊與散發是怎麼處理的
    • 需不需要 regsvr32
    • 有沒有相依 DLL
    • 需不需要系統管理員權限
  5. 位元數是否一致
    • 是 32bit
    • 是 64bit
    • 需不需要在同一個處理程序裡執行
  6. 未來要怎麼處理
    • 就這樣保留
    • 劃出邊界包起來
    • 換掉

12.1. 要用什麼工具去查

上面 6 點講的是「看什麼」,所以也把「開哪裡」一併列出來。不知道這些的話,就算有檢查清單,第一步就會卡住。

想查的事 用的工具、要看的地方
那個 .dll / .ocx 是不是能自我註冊的 COM 伺服器 用 Visual Studio 附的 dumpbin /exports 檔案名稱,如果有匯出 DllRegisterServer,就是自我註冊型的 COM 伺服器。regsvr32 呼叫的正是這個函式
註冊與取消註冊的做法 regsvr32 檔案名稱 是註冊,regsvr32 /u 檔案名稱 是取消註冊,兩者都需要系統管理員權限。在 64bit Windows 上,%SystemRoot%\System32\regsvr32.exe 是 64bit 用,%SystemRoot%\SysWOW64\regsvr32.exe 是 32bit 用,要配合元件的位元數挑選
從 CLSID 查出實體檔案 登錄檔 HKEY_CLASSES_ROOT\CLSID\{CLSID}\InprocServer32 的預設值,就是處理程序內伺服器(DLL / OCX)的路徑。處理程序外的元件則看 LocalServer32
從 ProgID 查出 CLSID HKEY_CLASSES_ROOT\ProgID名稱\CLSID 的預設值就是 CLSID。反過來也可以從 CLSID 那一側看 ProgID 子機碼
32bit 元件註冊在哪裡 在 64bit Windows 上,32bit 用的註冊會進到 HKEY_LOCAL_MACHINE\SOFTWARE\Classes\WOW6432Node\CLSID 底下。不要只看 64bit 那一側就判斷「沒有註冊」
列出對外公開的介面 如果有 Windows SDK 內含的 OLE/COM Object Viewer(oleview.exe),可以列出已註冊的類別與 Type Library。有些 SDK 版本不會一起附上,沒有的話就從登錄檔以及開發環境那一側的設定引用項目追下去
宿主端的位元數 在工作管理員的「詳細資料」索引標籤裡,於資料行標題上按右鍵加入「平台」資料行,就能看出每個處理程序是 32 位元還是 64 位元。32bit 的 OCX 沒辦法直接載進 64bit 處理程序
註冊或相依 DLL 的解析失敗 用 Process Monitor 追登錄檔與檔案的存取,就能看到它去找哪個機碼、哪個 DLL 而失敗。用法整理在 Process Monitor(ProcMon)實戰指南

不看這些就直接喊 因為有 ActiveX,所以全部重新實作 往前衝,會把過去的陷阱漂亮地踩一遍。 先把上面 6 點與工具的對照關係填完,再去決定第 10 章的「保留 / 包起來 / 取代」比較安全。

調查的順序依序查看是什麼元件、在哪裡執行、檔案與識別碼是什麼、註冊與散發怎麼處理、位元數是否一致,然後再決定保留、包起來還是取代的圖。先看是什麼元件再看在哪裡執行清查檔案與識別碼確認註冊與散發確認位元數決定保留、包起來還是取代

圖 16: 不要一開始就衝去重新實作,照這個順序填完再決定方針比較安全。

13. 總結

要用最草率、但在實務上派得上用場的方式講 COM / ActiveX / OCX 的差異,就是這樣。

  • COM 是底層
  • ActiveX 是以 COM 為基礎的嵌入式元件脈絡
  • OCX 是 ActiveX 控制項常見的檔案

只要能把這 3 個分開來想,

  • 這只是單純的 .ocx 嗎
  • 這是 COM 整體的問題嗎
  • 這是瀏覽器相依的 ActiveX 嗎
  • 這是在桌面上可以保留的元件嗎

就會變得清楚很多。

舊技術之所以難,不是因為名字老,而是因為 底層、元件、檔案會出現在同一段對話裡 才顯得麻煩。 不過只要看得見結構,它意外地會變成一個處理得動的問題。

14. 參考資料

共用相同標籤的最新文章。能以相近的主題延伸理解。

與本文相近的主題頁面。以本文為起點,可進一步連到相關服務與其他文章。

本文連結到以下服務頁面,歡迎從最接近的入口查看。

常見問題

整理諮詢這個主題時常見的問題。

OCX 檔案是什麼?
OCX 是實作 ActiveX 控制項時常用的副檔名。在 Windows 的實務現場看到 .ocx,第一個可以懷疑的就是嵌入式控制項那一類的 COM 元件。它常出現在廠商 SDK 的散發檔案、VB6 / Access / MFC 的舊專案、安裝程式裡需要註冊的檔案,以及需要 regsvr32 的元件裡。先記住 OCX 是檔案的形式而不是概念本身,就不容易混淆。
COM 和 ActiveX 有什麼不同?
COM 是 Windows 上元件彼此往來所依據的二進位契約,也就是底層。ActiveX 則是以 COM 為基礎的可重複使用軟體元件,尤其常指嵌入宿主或容器裡使用的控制項這個脈絡。用「COM = 機制、ActiveX = 元件的脈絡、OCX = 檔案」來理解,整體會清楚很多。ActiveX 的底層是 COM,但 ActiveX 並不是 COM 本身。
ActiveX 是 Internet Explorer 專用的技術嗎?
不是。它在 IE 上出名確實是事實,但 ActiveX 控制項也長期用在 Access 表單、VB6 應用程式、MFC 的容器、Office 與 VBA 周邊,以及從 WinForms 透過 COM 包裝層使用等 Windows 應用程式這一側。與其看成瀏覽器專用技術,在實務上把它當成 Windows 的嵌入式元件技術會更貼切。另外,瀏覽器側的 ActiveX 相依性,現在與其想「怎麼延續使用」,不如從「要從哪裡開始拆掉」來思考比較實際。
OCX 和 DLL 有什麼不同?
.ocx 這個副檔名相當強烈地暗示它是 ActiveX 控制項,而 .dll 可能是一般的函式庫,可能是 COM 伺服器,也可能是 ActiveX 周邊的相依 DLL。實務上常見的樣子是 vendorcontrol.ocx 當主角,vendorhelper.dll 之類的 DLL 在旁邊支撐。如果問 OCX 算不算 DLL 的一種,感覺上是接近的,但在調查與遷移的場合,把角色分開來看比較安全。

作者檔案

本文作者的個人檔案頁面。

Go Komura

小村軟體有限公司 代表

以 Windows 軟體開發、技術諮詢與故障調查為中心,在難以重現的故障調查與既有資產仍在運作的專案上具有優勢。

回到部落格一覽