Windows 內建命令行工具 (存在於 98/2000/XP/2003/Vista/7/10/11),位於 `
| 特性 | DLL (Dynamic Link Library) | OCX (OLE Control Extension) |
|---|---|---|
| 本質 | 導出函數的代碼庫 | 基於 COM 的可視化/非可視化控件 |
| 運行方式 | 被宿主進程 `LoadLibrary` 加載 | 通過 `CoCreateInstance` 實例化 |
| 典型用途 | 系統 API、運行庫、插件接口 | VB6/VC6 控件、IE ActiveX、Office 嵌入對象 |
| 註冊入口 | DllRegisterServer / DllUnregisterServer | 同 DLL,但常包含類別工廠註冊 |
為何要註冊? 組件雖在硬盤,但系統「電話簿」(註冊表) 沒有它的條目,調用方無法找到它。註冊即「黃頁登記」。
regsvr32 [/u] [/s] [/n] [/i[:cmdline]]
| 參數 | 含義 | 典型場景 |
|---|---|---|
| (無) | 註冊組件 (調用 DllRegisterServer) | 安裝新控件、修復損壞註冊 |
| /u | 註銷組件 (調用 DllUnregisterServer) | 卸載殘留組件、清理衝突版本 |
| /s | 靜默模式,不彈出成功/失敗對話框 | 批處理/靜默安裝腳本 |
| /n | 不調用 DllRegisterServer (需配合 /i) | 特殊安裝邏輯 |
| /i[:cmdline] | 調用 DllInstall 傳遞參數;配合 /u 時調用 DllInstall 進行反安裝 | 側邊組件 (SxS) 安裝、自定義安裝邏輯 |
regsvr32 c:\windows\system32\shmedia.dllregsvr32 /u /s c:\codecs\badfilter.ax%SystemRoot%\System32\regsvr32.exe my64.dll%SystemRoot%\SysWOW64\regsvr32.exe my32.dll| 錯誤現象/代碼 | 根因分析 | 解決方案 |
|---|---|---|
| 「未指定模塊名稱」 / 0x00000001 | 命令行未提供 DLL 路徑 | 補全完整路徑,含空格加雙引號 |
| 「模塊 xxx.dll 加載失敗」 / 0x8007007E | 依賴項缺失 (如 VC++ 運行庫、其他 DLL) | Dependency Walker 分析依賴 → 補裝運行庫/放入同目錄 |
| 「入口點 DllRegisterServer 未找到」 / 0x80040200 | 該 DLL 非 COM 組件 (無導出註冊函數) | 確認文件屬性,非 COM 組件無需註冊 |
| 「訪問被拒絕」 / 0x80070005 | 權限不足 (寫入 HKCR 需管理員) | 以管理員身份運行 CMD / PowerShell |
| 「指定的模塊不是有效的 Windows 映像」 | 位數不匹配 (32 位 regsvr32 載入 64 位 DLL 或反向) | 選擇正確位數的 regsvr32 (System32 vs SysWOW64) |
| 「OLE 初始化失敗」 | COM 庫未初始化 / 系統服務異常 | 重啟 / 檢查 RPC 服務 / 運行 `sfc /scannow` |
管理員 PowerShell 執行:
cd %windir%\system32
dir *.dll, *.ocx, *.ax | ForEach-Object { regsvr32 /s $_.FullName } 2>&1 | Out-File regsvr32_fix.log
日誌中僅關注非「成功」行,針對性處理。警告:此操作會重新註冊所有組件,耗時數分鐘,可能短暫導致 Shell 擴展失效,建議在維護窗口執行。
Regsvr32 是 COM 組件的「戶口本辦理大廳」。掌握「管理員權限 + 正確位數 + 依賴項完整」三要素,90% 註冊疑難雜症迎刃而解。遇到 0x8007007E 先查依賴,遇到 0x80040200 確認組件類型,遇到拒絕訪問提權重來。