現象:OCX 已用 `regsvr32` 成功註冊,但在 VC6.0「插入控件」對話框中找不到該控件。根因:**註冊過程未正確寫入 `HKEY_CLASSES_ROOT\CLSID\{...}` 鍵值**,或註冊的類別不包含 `Control` 子鍵,導致 VC 不認其為 ActiveX 控件。
HKEY_CLASSES_ROOT\CLSID\{YOUR_GUID}
├── InprocServer32 (默認值 = OCX 絕對路徑)
├── ProgID (默認值 = YourProgID)
├── ToolboxBitmap32 (可選,工具箱圖標)
└── Control (⭐ 關鍵:標識為 ActiveX 控件,無此鍵 VC 不顯示)
HKEY_CLASSES_ROOT\YourProgID\CLSID (默認值 = {YOUR_GUID})
| 原因 | 現象 | 修復 |
|---|---|---|
| OCX 內 `DllRegisterServer` 未創建 `Control` 鍵 | 註冊表無 Control 子鍵 | 手動添加 `Control` 空鍵值,或修改 OCX 代碼重新編譯註冊 |
| 路徑包含中文/空格,註冊表路徑未加引號 | InprocServer32 值被截斷 | 手動修正路徑加雙引號:`"C:\My Path\Ctrl.ocx"` |
| 64 位系統註冊到 Wow6432Node,VC6.0 為 32 位 | 32 位註冊表視圖缺失 | 用 `C:\Windows\SysWOW64\regsvr32.exe your.ocx` 顯式 32 位註冊 |
| 權限不足 | 寫入 HKCR 失敗 | 以管理員身份運行命令提示符再註冊 |
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\CLSID\{12345678-1234-1234-1234-123456789ABC}]
@="MyCustom Control"
"Control"=""
[HKEY_CLASSES_ROOT\CLSID\{12345678-1234-1234-1234-123456789ABC}\InprocServer32]
@="C:\\Full\\Path\\MyCtrl.ocx"
"ThreadingModel"="Apartment"
[HKEY_CLASSES_ROOT\CLSID\{12345678-1234-1234-1234-123456789ABC}\ProgID]
@="MyCtrl.MyCtrl.1"
[HKEY_CLASSES_ROOT\CLSID\{12345678-1234-1234-1234-123456789ABC}\ToolboxBitmap32]
@="C:\\Full\\Path\\MyCtrl.ocx, 101"
[HKEY_CLASSES_ROOT\MyCtrl.MyCtrl.1\CLSID]
@="{12345678-1234-1234-1234-123456789ABC}"
保存為 `register.reg`,雙擊導入。GUID 需替換為 OCX 真實 GUID (可用 OLE/COM Object Viewer 查看)。