ActiveX 控件(OCX)雖屬舊技術,但在企業內部系統、銀行外掛、工控監控等場景仍廣泛使用。本文記錄將 VC++ 6.0 / VS2003 建立的 OCX 專案打包為 `.cab`、數位簽名、編寫 `.inf` 安裝腳本、發布至網頁自動下載安裝的完整流程,避開常見坑點。
[version]
signature="$CHICAGO$"
AdvancedINF=2.0
[Add.Code]
MyCtrl.ocx=MyCtrl.ocx
[MyCtrl.ocx]
file=thiscab
clsid={YOUR-CLSID-GUID}
FileVersion=1,0,0,0
RegisterServer=yes
DestDir=11 ; System32
; 若需相依 DLL,加入 [Dependency] 區段
; files.lst
MyCtrl.ocx
MyCtrl.inf
; 執行
cabarc n MyCtrl.cab @files.lst
; 或
makecab /f directive.ddf
rem 1. 建立根憑證
makecert -sk MyRootKey -ss MyRootStore -n "CN=MyTestRoot" -r MyRoot.cer
rem 2. 建立程式碼簽名憑證(由根憑證簽發)
makecert -sk MyCodeKey -is MyRootStore -n "CN=MyCodeSign" -ic MyRoot.cer -iv MyRoot.pvk -pe -sv MyCode.pvk MyCode.cer
rem 3. 轉換為 SPC
cert2spc MyCode.cer MyCode.spc
rem 4. 簽名 CAB
signcode -spc MyCode.spc -v MyCode.pvk -n "MyCtrl" -i "https://mycompany.com" -t https://timestamp.verisign.com/scripts/timstamp.dll MyCtrl.cab
正式環境**必須購買受信任 CA(如 Sectigo、DigiCert、GlobalSign)簽發的程式碼簽名憑證**,否則客戶端會彈出「發行者未經驗證」警告,甚至被 SmartScreen 攔截。
<object id="MyCtrl" classid="clsid:YOUR-CLSID-GUID"
codebase="MyCtrl.cab#version=1,0,0,0"
width="300" height="200">
<param name="BackColor" value="#FFFFFF" />
</object>
| 現象 | 可能原因 | 對策 |
|---|---|---|
| CAB 下載後不安裝 | .inf 簽名區塊缺失、CLSID 不符、版本號未遞增 | 檢查 .inf、遞增 version、重新簽名 |
| 安裝後網頁顯示紅叉 | OCX 註冊失敗(相依 DLL 缺失、權限不足、架構不匹配 x86/x64) | Dependency Walker 分析、管理員身份註冊、目標平台一致 |
| IE 彈出安全警告 | 憑證不受信、過期、時間戳缺失 | 購買正規 EV Code Signing 憑證、加時間戳 |
| Windows 10/11 完全無法載入 | IE 模式/Edge IE Mode 未啟用、ActiveX 被組策略封鎖 | 群組原則啟用 IE Mode、加入相容清單 |
新專案**強烈建議避免 ActiveX**,改用: