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

並行組件共享實作指南(二):安裝、DLL/COM 重定向與隔離策略

     編輯:關於C++

一、現有組件改造為並行組件的核心原則

  • 啟用方式改為相對路徑。
  • 隔離全域狀態(登錄、檔案、共享記憶體等)。
  • 指派新 CLSID、ProgID,重新命名 DLL/OCX 檔案。
  • 並行版本不向後相容舊版本。

二、狀態儲存隔離:登錄機制

版本化登錄路徑

HKCU\MyCompany\MyComponent\VersionXXXX\

範例:設定 EnableSuperCoolFeature = TRUE

  • 傳統:HKCU\Software\MyCompany\MyComponent\EnableSuperCoolFeature
  • 並行:HKCU\Software\MyCompany\MyComponent\Version01.01\EnableSuperCoolFeature

應用程式級隔離

HKCU\MyCompany\MyComponent\VersionXXYY\SomeApplication\

SomeApplication 取自 GetModuleFileName() 回傳值,確保各應用程式擁有獨立設定空間。

最佳實踐:持久化模型

  • 應用程式負責保存使用者狀態,不直接操作組件登錄項。
  • 組件提供 API 供應用程式儲存/還原並行一致的設定。

非登錄儲存同樣需隔離

  • 受保護儲存區 (PStore)
  • WinInet 快取
  • SQL Server / Jet 資料庫

三、並行組件安裝與解除安裝

平台支援檢測

BOOL bPlatformSupportsSideBySide(void)
{
    OSVERSIONINFOEX osviex = { sizeof(OSVERSIONINFOEX) };
    if (!GetVersionEx((OSVERSIONINFO*)&osviex)) return FALSE;
    if (osviex.dwPlatformId == VER_PLATFORM_WIN32_NT && osviex.dwMajorVersion < 5) return FALSE; // NT4 無 DLL 重導向
    return TRUE; // Win2000、Win98 SE 以上支援
}

安裝步驟

  1. 複製組件至應用程式目錄(或子目錄)。
  2. COM 註冊時設定 msidbClassAttributesRelativePath 位元,使用相對路徑。
  3. GUID 註冊項建立參考計數:
    ReferenceCount=1(首次安裝),後續安裝遞增。
  4. 類型庫內嵌於 DLL,不註冊至系統登錄。

解除安裝步驟

  1. 遞減參考計數。
  2. 歸零時刪除 GUID 註冊項;大於零則保留(其他應用程式仍在使用)。

四、DLL/COM 重定向機制

啟用方式

在應用程式 .exe 同目錄建立空檔 應用程式名.exe.local。
例:myapp.exe → 建立 myapp.exe.local。

搜尋順序變更

  1. 優先搜尋應用程式目錄下的 DLL/OCX。
  2. 找不到才回退標準搜尋路徑或 COM 伺服器路徑。

選擇隔離組件的指導原則

  • 勿隔離受「系統檔案保護」保護的檔案(.sys, .dll, .exe, .ocx 多數屬之)。
  • 必須測試所有應用程式並行有效性,OS 不強制並行。
  • 警惕快速修補能力下降:組件分散於各應用目錄,管理員需知曉所有位置。

五、實戰方案

方案 I:ActiveX 控制項專用化

新應用程式需不同版本 ActiveX,舊版本有語意差異。
作法:新版控制項置於新應用程式目錄,建立 .local 檔強制載入本地版本。

限制:VB 建立的 ActiveX 註冊時寫入絕對路徑,難以原生並行。

方案 II:Win32 DLL 專用化

共享 DLL 升級破壞向後相容,導致舊應用程式失效。
作法:舊版 DLL 複製至舊應用程式目錄,建立 .local 檔。

六、隔離 COM 伺服器安裝注意事項

  • 若機器已安裝該 COM 伺服器任何版本,勿註冊隔離版本(避免覆蓋 InprocServer32 路徑)。
  • 若機器未安裝該 COM 伺服器,需同時複製至應用程式目錄與系統目錄(或共享位置),並在系統目錄註冊共享副本。
  • 經驗法則:安裝隔離版本後,確保共享版本與隔離版本共存且註冊共享版本,解除安裝時才能安全移除隔離版本不影響其他應用。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved