ActiveX 控制項(副檔名 .ocx)本質是實作 DllRegisterServer/DllUnregisterServer 的 COM 伺服器 DLL。在 Windows 系統中使用前必須註冊至登錄機碼(HKCR\CLSID\{...}、HKCR\TypeLib\{...} 等)。本文詳細比較三種註冊方式的適用場景、操作步驟與 C++Builder 程式碼實作。
regsvr32.exe 命令列工具(最輕量)系統內建 %windir%\System32\regsvr32.exe(64 位元)與 %windir%\SysWOW64\regsvr32.exe(32 位元)。
REM 註冊 32 位元 OCX(在 64 位元系統上)
%windir%\SysWOW64\regsvr32.exe "C:\Path\To\MyCtrl.ocx"
REM 反註冊
%windir%\SysWOW64\regsvr32.exe /u "C:\Path\To\MyCtrl.ocx"
REM 靜默模式(無訊息框)
regsvr32 /s "C:\Path\To\MyCtrl.ocx"
.ocx、.dll 等 COM 檔案加入DllRegisterServer,解除安裝自動呼叫 DllUnregisterServer原理:LoadLibrary 載入 OCX → GetProcAddress 取得 DllRegisterServer/DllUnregisterServer → 呼叫函數指標。
#include <vcl.h>
#pragma hdrstop
#include
bool RegisterOCX(const AnsiString& ocxPath, bool bUnregister = false) {
HINSTANCE hLib = LoadLibrary(ocxPath.c_str());
if (!hLib) return false;
const char* procName = bUnregister ? "DllUnregisterServer" : "DllRegisterServer";
FARPROC pFn = GetProcAddress(hLib, procName);
if (!pFn) { FreeLibrary(hLib); return false; }
HRESULT hr = ((HRESULT (__stdcall *)())pFn)();
FreeLibrary(hLib);
return SUCCEEDED(hr);
}
// 使用範例:按鈕點擊事件
void __fastcall TForm1::btnRegisterClick(TObject *Sender) {
AnsiString ocx = "F:\\MyCtrl.ocx"; // 建議放在應用程式目錄或 System32
if (RegisterOCX(ocx, false))
ShowMessage("註冊成功!");
else
ShowMessage("註冊失敗:檔案不存在、非有效 OCX 或需管理員權限。");
}
void __fastcall TForm1::btnUnregisterClick(TObject *Sender) {
AnsiString ocx = "F:\\MyCtrl.ocx";
if (RegisterOCX(ocx, true))
ShowMessage("反註冊成功!");
else
ShowMessage("反註冊失敗。");
}
ShellExecute 呼叫 regsvr32.exe(無需管理員權限提示的替代方案)// 註冊
ShellExecute(Handle, _T("open"), _T("regsvr32.exe"), _T("/s \"MyCtrl.ocx\""), NULL, SW_HIDE);
// 反註冊
ShellExecute(Handle, _T("open"), _T("regsvr32.exe"), _T("/u /s \"MyCtrl.ocx\""), NULL, SW_HIDE);
注意:Vista+ 需 UAC 提升權限,ShellExecute 會彈出同意對話框;若需完全靜默,請採用上方 LoadLibrary 方案並確保進程具備管理員權限(Manifest requireAdministrator)。
| 場景 | 建議方式 | 備註 |
|---|---|---|
| 開發機快速測試 | regsvr32 命令列 | 批次檔自動化 |
| 正式產品安裝包 | InstallShield / Inno Setup / NSIS | Self-Registered 屬性或腳本呼叫 regsvr32 |
| 綠色軟體/單一 EXE | 程式碼 LoadLibrary + DllRegisterServer | 啟動時檢查並自動註冊,退出可選反註冊 |
| 外掛/增益集架構 | 程式碼動態載入/卸載 | 搭配 FreeLibrary 實現熱插拔 |