Share via


Windows 機密文件擺脫 DLL Hell

Raymond Chen

DLL HELL。 如此惡名昭彰,可知是多麼狡猾的問題。當您安裝一個程式之後,其他似乎不相干的程式卻忽然不能運作了。這是因為兩個程式暗地經由一個共用的 DLL 檔而產生關係。可能是這兩個程式對於系統目錄中的 MSVCRT.DLL 檔案版本有各自的要求。或是第一個程式升級 ActiveX® 控制項,而第二個程式也用到此控制項,但升級後的控制項與第二個程式並不完全相容。

如果這兩個程式對於公司的日常營運而言都不可或缺,則怪罪於哪一個程式實在於事無補。當務之急是讓程式趕快正常執行。這時候講「我們賠錢」與「鮑伯害我們賠錢」,都沒什麼差別了。事實上都是公司在賠錢,而您的任務就是馬上解決問題。

通常必須先決定要挽救哪一個程式。從 Windows® 2000 開始,有急救工具可協助您修復這些衝突。但這些急救工具只是暫時的解決辦法,讓系統趕快恢復正常步調,給您時間找出更長久的辦法來解決衝突。

Windows 2000 已實作一種初步的解決方案,也就是現在所謂的「動態連結程式庫重新導向」這個新名詞。若要啟用 DLL 重新導向,請建立檔案並以您要重新導向 DLL 的程式來命名,但在名稱後面加上 .local。例如,若要對 C:\Program Files\Litware Inc\Invoice.exe 套用重新導向,請建立檔案 C:\Program Files\Litware Inc\Invoice .exe.local。檔案的內容無關緊要,重要的是檔案要存在。

當程式啟用重新導向之後,該程式在嘗試載入 DLL 時會先查看本身所在的目錄,然後才會查看平常的搜尋位置。因此,以發生衝突的 MSVCRT.DLL 檔案為例,您可以在每個程式中啟用重新導向,然後在每個程式的安裝目錄中放入一份專用的 MSVCRT.DLL 複本。此後,每個程式就會收到自己的 MSVCRT.DLL 版本,也就是用來測試程式的 DLL 版本。

這項技巧的神奇之處在於就算程式以完整路徑來載入 DLL 也沒有問題。例如,假設程式嘗試載入 C:\Program Files\Common Files\Proseware Inc\taxplugin.dll。在升級到 Proseware 2.0 之後,您發現該軟體的課稅外掛程式和您的發票程式不相容。您能做的就是將一份舊版的課稅外掛程式複製到 C:\Program Files\Litware Inc\taxplugin.dll。雖然程式以完整路徑來載入課稅外掛程式,但 DLL 重新導向仍會查看目前的目錄,並使用本機覆寫來代替 Proseware Inc 目錄中的覆寫。

在 Windows XP 和 Windows Vista™ 中,DLL 重新導向的規則稍微不同,但一般原則還是一樣。除了建立 .local 檔案,您也可以建立 .local 目錄。在此情況下,就會搜尋 .local 目錄,而不是程式的安裝目錄。這可讓您對同一目錄中的多個程式套用重新導向而不會發生衝突。

請注意,您不能對含有應用程式資訊清單的程式套用重新導向,而且所謂的「已知的 DLL」也無法重新導向。(有關詳細資訊,請參閱動態連結程式庫重新導向 (英文)。)

DLL 重新導向無法讓您完全擺脫 DLL Hell,但至少有一些急救技巧可降低傷害程度,讓您有時間找出問題。

圖 1

圖 1   

Raymond Chen 在自己的網站 The Old New Thing 和新書 The Old New Thing (Addison-Wesley, 2007) 中撰寫有關 Windows 歷史和 Win32 程式設計的文章。不過他可沒有養一隻叫做 The Old New Thing 的貓。

© 2008 Microsoft Corporation and CMP Media, LLC. 保留所有權利;未經允許,嚴禁部分或全部複製.