DLL重定向

DLL 夢魘
  問題竟嚴重到如此境地,甚至於自身都背有這麼惡劣的綽號。當您安裝某個程序時,另一個看似與之無關的程序忽然停止工作。原因出乎您的意料,這兩個程序通過一個共享的 DLL 文件產生了某種聯繫。它們對於系統目錄中應該存在哪種 MSVCRT.DLL 文件版本產生了分歧。或者,一個程序可能會升級另一個程序正在使用的 ActiveX® 控件,而後者對於升級後的控件並不完全兼容。
如果這兩個程序在您的公司的日常運作中都是必不可少的,則追究哪個纔是罪魁禍首就顯得無關緊要。當務之急是要讓它們啓動並運行。比方說,“我們不斷賠錢”和“都怪 Bob,他使我們不斷賠錢”,這兩種情況並無二樣,因爲不管是哪一種情況,您的公司都在不斷賠錢,立即解決問題對我們而言都責無旁貸。
這個比方常常用來形容非要對程序進行取捨的情況。從 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 重定向仍然會在當前目錄中查找並使用本地替代的 DLL,而不是 Proseware Inc 目錄中的 DLL。
在 Windows XP 和 Windows Vista™ 中,DLL 重定向的規則略有不同,但基本原理是相同的。除創建 .local 文件外,還可以創建 .local 目錄。在這種情況下,程序搜索的是 .local 目錄,而不是其安裝目錄。該方法可以在同一目錄中對多個程序應用重定向,而不會產生任何衝突。
請注意,無法對包含應用程序清單的程序應用重定向,並且一些所謂的已知 DLL 也不應作爲重定向的對象。(有關詳細信息,請參閱“Dynamic-Link Library Redirection”(英文)。)
DLL 重定向不可能幫您完全擺脫 DLL 夢魘,但是當您解決這些問題時,它至少會爲您提供一些應急的處理方法。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章