探討 Windows 2000 / Windows 98 Second Edition 實現並行組件共享的機制,涵蓋新組件建立、DLL/COM 重定向解決版本衝突、編寫/安裝規範與重新打包測試指南。
現代 OS 與應用程式由大量共享組件構成。全域共享要求組件絕對向後相容,但實務上極難達成。應用程式可能無意間依賴組件的副作用行為;組件修正錯誤反而導致相依應用程式失效,即經典的「DLL Hell」。
隔離是共享的對立面。選擇性隔離允許同一組件多版本共存,應用程式使用經設計測試的特定版本,不受其他應用程式安裝影響。Windows 2000/98 SE 引入並行共享,透過選擇性隔離大幅緩解 DLL Hell。
| 屬性 | 並行 (SxS) 組件 | DLL/COM 重定向 |
|---|---|---|
| 核心焦點 | 建立穩定新組件,免受未來版本不相容變更影響 | 隔離現有應用程式,避免因其他應用安裝不相容共享 DLL 導致問題 |
| 版本隔離性 | 是,部署於應用程式目錄,專屬隔離 | 是,應用程式使用其目錄下版本,忽略系統其他版本 |
| 需修改代碼 | 是,至少修改 COM 註冊為相對路徑,可能需處理全域狀態 | 否,無需重編譯,管理員即可重新配置 |
| 普遍適用性 | 是,經良好設計測試的 SxS 組件無 DLL Hell 問題 | 否,現有組件未必設計為多版本並行執行,需實測驗證 |
並行組件為普通 COM/Win32 組件,但安裝於應用程式目錄(或子目錄)而非系統目錄。特定應用程式專用,與其他應用隔離。多版本可並行安裝於不同應用目錄,OS 可同時載入。
優勢:應用程式解除安裝時可安全刪除私有組件,不影響他應用。
註冊要求:必須正確向 OS 註冊,確保各版本不衝突(CLSID、ProgID、類型庫、執行緒模型等中繼資料跨版本不變)。
支援平台:Win2000、Win98 SE。舊版 Windows 視為全域共享(向後相容模式),應用程式需動態檢測 OS 版本決定共享策略。
#define,便於遷移版本(如 #define MyRegistryKey "MyAppv1.0.0.0")。TEMP 目錄;使用者資料與應用程式資料明確分離,勿放全域位置。RefCount),追蹤安裝/解除安裝次數。LoadRegTypeLib(登錄項為全域狀態,引用計數脆弱),改用 LoadTypeLib。