DLL 類組件透過匯出標準函數實現註冊:
RegSvr32.exe D:\com.dllDllRegisterServerRegSvr32.exe /u D:\com.dllDllUnregisterServer開發者需在 DLL 中實作這兩個匯出函數,執行登錄寫入/刪除 (CLSID、ProgID、TypeLib、介面代理等)。
EXE 無法被 RegSvr32 載入,COM 規範要求支援兩個命令列參數:
MyServer.exe /RegServer — 註冊MyServer.exe /UnregServer — 反註冊啟動時解析命令列,執行相應註冊邏輯後立即退出。
COM 提供 CoFreeUnusedLibraries() (舊版為 CoFreeAllLibraries) 實現延遲卸載:
DllCanUnloadNow 回傳 S_OK)IClassFactory::LockServer(FALSE) 釋放所有鎖)FreeLibrary 卸載 DLL| 函數/介面 | 職責 | 實作提示 |
|---|---|---|
DllCanUnloadNow | 回傳 S_OK 表示可卸載 | 檢查全域物件計數 g_cObj == 0 && g_cLock == 0 |
IClassFactory::LockServer | 增加/減少鎖定計數 | InterlockedIncrement/Decrement 保護 g_cLock |
| 物件建構/解構 | 維護 g_cObj | 建構時 ++,解構時 --,使用 Interlocked 操作 |
CoFreeUnusedLibraries 會立即強制卸載 → 實為 **輪詢檢查**,需滿足條件LockServer(TRUE) 時增加鎖計數 → 導致過早卸載,造成崩潰DllRegisterServer → EXE 應實作 /RegServer 命令列CoFreeUnusedLibraries() (如每 5 分鐘)CComModule/CAtlDllModuleT) 已內建完整計數與鎖邏輯ATL::CComModule::RegisterServer / UnregisterServer,減少手寫登錄操作錯誤RegSvr32 /s 或 MyServer.exe /RegServer 靜默註冊