首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

ActiveX 控制項(OCX)註冊與反註冊三大方法:命令列、安裝包、程式碼自註冊

     編輯:關於C++

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"
  • 優點:無需編寫程式、適合手動測試、批次腳本部署
  • 缺點:需管理員權限、無法在應用程式內靜默完成、易被使用者誤刪

二、方法二:InstallShield 等安裝製作工具(企業級部署)

  1. 建立 File Group,將 .ocx、.dll 等 COM 檔案加入
  2. 設定該 File Group 屬性 Self-Registered = Yes
  3. 建置 Setup.exe,安裝時自動呼叫 DllRegisterServer,解除安裝自動呼叫 DllUnregisterServer
  • 優點:專業安裝體驗、自動處理版本衝突、支援 Rollback、可簽章驗證
  • 缺點:學習曲線陡、安裝包體積大、過度殺雞用牛刀

三、方法三:應用程式內嵌註冊程式碼(綠色軟體、外掛架構首選)

原理:LoadLibrary 載入 OCX → GetProcAddress 取得 DllRegisterServer/DllUnregisterServer → 呼叫函數指標。

C++Builder 完整範例

#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)。

四、部署最佳實踐

五、常見錯誤與對策

  • 0x80020009 / 0x80004005:OCX 內部 DllRegisterServer 實作失敗,常見於缺少相依 DLL、權限不足、類別衝突。用 regsvr32 /i 或檢查事件檢視器。
  • 64 位元系統註冊 32 位元 OCX:必須使用 SysWOW64\regsvr32.exe,或在 32 位元進程中呼叫 LoadLibrary。
  • 重複註冊:DllRegisterServer 應具冪等性,重複呼叫不應報錯;若報錯檢查 OCX 實作品質。

六、總結

掌握 regsvr32、安裝工具 Self-Registered、LoadLibrary 三種註冊手段,即可覆蓋從開發測試到企業級部署、綠色軟體分發的所有場景。C++Builder 開發者優先採用 LoadLibrary 內嵌方案,配合 Manifest 提權,實現使用者零感知的自動註冊體驗。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
場景建議方式備註
開發機快速測試regsvr32 命令列批次檔自動化
正式產品安裝包InstallShield / Inno Setup / NSISSelf-Registered 屬性或腳本呼叫 regsvr32
綠色軟體/單一 EXE程式碼 LoadLibrary + DllRegisterServer啟動時檢查並自動註冊,退出可選反註冊
外掛/增益集架構程式碼動態載入/卸載搭配 FreeLibrary 實現熱插拔