DLL(Dynamic Link Library)文件爲動態連接庫文件,又稱「應用程序拓展」,是軟件文件類型。在Windows中,許多應用程序並非一個完整的
可執行文件,它們被分割成一些相對獨立的
動態連接庫,即DLL文件,放置於系統中。當咱們執行某一個
程序時,相應的DLL文件就會被調用。一個應用程序可以使用多個DLL文件,一個DLL文件也可能被不一樣的應用程序使用,這樣的DLL文件被稱爲共享DLL文件。
[1]
DLL文件中存放的是各種程序的函數(子過程)實現過程,當程序須要調用函數時須要先載入DLL,而後取得函數的地址,最後進行調用。使用DLL文件的好處是程序不須要在運行之初加載全部代碼,只有在程序須要某個函數的時候才從DLL中取出。另外,使用DLL文件還能夠減少程序的體積。
在
Windows操做系統中,每一個程序均可以使用該 DLL 中包含的功能來實現「打開」對話框。這有助於促進代碼重用和內存的有效使用。
經過使用 DLL,程序能夠實現模塊化,由相對獨立的
組件組成。例如,一個記帳程序能夠按模塊來銷售。能夠在運行時將各個模塊加載到主程序中(若是安裝了相應模塊)。由於模塊是彼此獨立的,因此程序的加載速度更快,並且模塊只在相應的功能被請求時才加載。
此外,能夠更爲容易地將更新應用於各個模塊,而不會影響該程序的其餘部分。例如,您可能具備一個工資計算程序,而稅率每一年都會更改。當這些更改被隔離到 DLL 中之後,您無需從新生成或安裝整個程序就能夠應用更新。
Windows操做系統中的一些做爲 DLL 實現的文件
·ActiveX 控件 (.ocx) 文件
·控制面板 (.cpl) 文件
.cpl 文件的一個示例是位於控制面板中的項。每一個項都是一個專用 DLL。
1、 使用較少的資源
當多個程序使用同一個函數庫時,DLL 能夠減小在磁盤和
物理內存中加載的代碼的重複量。這不只能夠大大影響在前臺運行的程序,並且能夠大大影響其餘在 Windows操做系統上運行的程序。
2、 推廣模塊式體系結構
DLL 有助於促進模塊式程序的開發。這能夠幫助您開發要求提供多個語言版本的大型程序或要求具備模塊式
體系結構的程序。模塊式程序的一個示例是具備多個能夠在運行時動態加載的模塊的計賬程序。
當 DLL 中的函數須要更新或修復時,部署和安裝 DLL 不要求從新創建程序與該 DLL 的連接。此外,若是多個程序使用同一個 DLL,那麼多個程序都將從該更新或修復中獲益。當您使用按期更新或修復的第三方 DLL 時,此問題可能會更頻繁地出現。
一、如何瞭解某應用程序使用哪些DLL文件
右鍵單擊該應用程序並選擇
快捷菜單中的「快速查看」命令,在隨後出現的「快速查看」窗口的「引入表」一欄中你將看到其使用DLL文件的狀況。
二、如何知道DLL文件被幾個程序使用
運行
Regedit,進入HKEY_LOCAL_MACHINE\Software\Microsrft\Windows\CurrentVersion\SharedDlls子鍵查看,其右邊窗口中就顯示了全部DLL文件及其相關數據,其中數據右邊小括號內的數字就說明了被幾個程序使用,(2)表示被兩個程序使用,(0)則表示無程序使用,能夠將其刪除。
三、如何解決DLL文件丟失的狀況
有時在
卸載文件時會提醒你刪除某個DLL文件可能會影響其餘應用程序的運行。因此當你卸載軟件時,就有可能誤刪共享的DLL文件。一旦出現了丟失DLL文件的狀況,若是你能肯定其名稱,能夠在Sysbckup(系統備份文件夾)中找到該DLL文件,將其複製到System文件夾中。若是這樣不行,在電腦啓動時又老是出現「***dll文件丟失……」的提示框,你能夠在「開始/運行」中運行Msconfig,進入系統配置實用程序對話框之後,單擊選擇「System.ini」標籤,找出提示丟失的DLL文件,使其不被選中,這樣開機時就不會出現錯誤提示了。
rundll的功能是以命令列的方式呼叫Windows的動態連接庫。
Rundll32.
exe與Rundll.exe的區別就在於前者是用於32位的鏈結庫,後者是用於16位的鏈結庫。
rundll32.exe是專門用來調用dll文件的程序。
若是用的是Win98,rundll32.exe通常存在於Windows目錄下;
若是用的Win
XP、Win7,rundll32.exe通常存在於Windows\System32目錄下。
如果在其它目錄,就多是一個
木馬程序,它會假裝成rundll32.exe。
當您在應用程序中加載 DLL 時,可使用兩種連接方法來調用導出的 DLL 函數。這兩種連接方法是加載時
動態連接和運行時動態連接。
在運行時動態連接中,應用程序調用 LoadLibrary 函數或 LoadLibraryEx 函數以在運行時加載 DLL。成功加載
DLL 後,可使用 GetProcAddress 函數得到要調用的導出的 DLL 函數的地址。在使用運行時動態連接時,無需使用
導入庫文件。
Win32 DLL的特色
Win32 DLL與 Win16 DLL有很大的區別,這主要是由操做系統的設計思想決定的。一方面,在Win16 DLL中程序
入口點函數和出口點函數(LibMain和WEP)是分別實現的;而在Win32 DLL中卻由同一函數DLLMain來實現。不管什麼時候,當一個進程或
線程載入和
卸載DLL時,都要調用該函數,它的原型是
BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason, LPVOID lpvReserved);
其中,第一個參數表示DLL的實例句柄;第三個參數系統保留;這裏主要介紹一下第二個參數,它有四個可能的值:DLL_PROCESS_ATTACH(進程載入),DLL_THREAD_ATTACH(
線程載入),DLL_THREAD_DETACH(線程
卸載),DLL_PROCESS_DETACH(進程卸載),在DLLMain函數中能夠對傳遞進來的這個參數的值進行判別,並根據不一樣的
參數值對DLL進行必要的初始化或清理工做。舉個例子來講,當有一個進程載入一個DLL時,系統分派給DLL的第二個參數爲DLL_PROCESS_ATTACH,這時,你能夠根據這個參數初始化特定的數據。另外一方面,在Win16環境下,全部應用程序都在同一
地址空間;而在Win32環境下,全部應用程序都有本身的私有空間,每一個進程的空間都是相互獨立的,這減小了應用程序間的相互影響,但同時也增長了編程的難度。你們知道,在Win16環境中,DLL的全局數據對每一個載入它的進程來講都是相同的;而在Win32環境中,狀況卻發生了變化,當進程在載入DLL時,系統自動把DLL
地址映射到該進程的私有空間,並且也複製該DLL的全局數據的一份拷貝到該進程空間,也就是說每一個進程所擁有的相同的DLL的全局數據其值卻並不必定是相同的。所以,在Win32環境下要想在多個進程中共享數據,就必須進行必要的設置。亦即把這些須要共享的數據分離出來,放置在一個獨立的數據段裏,並把該段的屬性設置爲共享。
可使用多個工具來幫助您解決 DLL 問題。如下是其中的部分工具。
Dependency Walker
Dependency Walker 工具能夠遞歸掃描以尋找程序所使用的全部依賴 DLL。當您在 Dependency Walker 中打開程序時,Dependency Walker 會執行下列檢查:
Dependency Walker 檢查是否丟失 DLL。
Dependency Walker 檢查是否存在無效的
程序文件或 DLL。
Dependency Walker 檢查導入函數和導出函數是否匹配。
Dependency Walker 檢查是否存在循環依賴性錯誤。
Dependency Walker 檢查是否存在因爲針對另外一不一樣操做系統而無效的模塊。
經過使用 Dependency Walker,您能夠記錄程序使用的全部 DLL。這可能有助於避免和更正未來可能發生的 DLL 問題。當您安裝 Microsoft Visual Studio 6.0 時,Dependency Walker 將位於如下目錄中:
drive\Program Files\Microsoft Visual Studio\Common\Tools
DLL Universal Problem Solver
DLL Universal Problem Solver (DUPS) 工具用於審覈、比較、記錄和顯示 DLL 信息。下表說明了組成 DUPS 工具的實用工具:
Dlister.exe:該實用工具枚舉計算機中的全部 DLL,而且將此信息記錄到一個文本文件或數據庫文件中。
Dcomp.exe:該實用工具比較在兩個文本文件中列出的 DLL,併產生包含差別的第三個文本文件。
Dtxt2DB.exe:該實用工具將經過使用 Dlister.exe 實用工具和 Dcomp.exe 實用工具建立的文本文件加載到 dllHell數據庫中。
DlgDtxt2DB.exe:該實用工具提供 Dtxt2DB.exe 實用工具的
圖形用戶界面(GUI) 版本。
DLL影響
一、用Windows系統盤功能進行文件修復;
二、若在此以前有一鍵備份過,能夠從新還原;
三、從網上下載系統文件而後覆蓋到原文件夾裏;