DLL是Dynamic Link Library的縮寫(xiě),意為動(dòng)態(tài)鏈接庫(kù)。DLL文件一般被存放在C:WindowsSystem目錄下。DLL是一個(gè)包含可由多個(gè)程序同時(shí)使用的代碼和數(shù)據(jù)的庫(kù)。
通過(guò)使用 DLL,程序可以實(shí)現(xiàn)模塊化,由相對(duì)獨(dú)立的組件組成。例如,一個(gè)計(jì)帳程序可以按模塊來(lái)銷(xiāo)售??梢栽谶\(yùn)行時(shí)將各個(gè)模塊加載到主程序中(如果安裝了相應(yīng)模塊)。因?yàn)槟K是彼此獨(dú)立的,所以程序的加載速度更快,而且模塊只在相應(yīng)的功能被請(qǐng)求時(shí)才加載。 此外,可以更為容易地將更新應(yīng)用于各個(gè)模塊,而不會(huì)影響該程序的其他部分。例如,您可能具有一個(gè)工資計(jì)算程序,而稅率每年都會(huì)更改。當(dāng)這些更改被隔離到 DLL 中以后,您無(wú)需重新生成或安裝整個(gè)程序就可以應(yīng)用更新。 Windows 操作系統(tǒng)中的一些作為 DLL 實(shí)現(xiàn)的文件: ·ActiveX 控件 (.ocx) 文件 ActiveX 控件的一個(gè)示例是日歷控件,它使您可以從日歷中選擇日期。 ·控制面板 (.cpl) 文件 .cpl 文件的一個(gè)示例是位于控制面板中的項(xiàng)。每個(gè)項(xiàng)都是一個(gè)專(zhuān)用 DLL。 ·設(shè)備驅(qū)動(dòng)程序 (.drv) 文件 設(shè)備驅(qū)動(dòng)程序的一個(gè)示例是控制打印到打印機(jī)的打印機(jī)驅(qū)動(dòng)程序。 DLL 的優(yōu)點(diǎn) 當(dāng)程序使用 DLL 時(shí)提供的一些優(yōu)點(diǎn): ·使用較少的資源 當(dāng)多個(gè)程序使用同一個(gè)函數(shù)庫(kù)時(shí),DLL 可以減少在磁盤(pán)和物理內(nèi)存中加載的代碼的重復(fù)量。這不僅可以大大影響在前臺(tái)運(yùn)行的程序,而且可以大大影響其他在 Windows 操作系統(tǒng)上運(yùn)行的程序。 ·推廣模塊式體系結(jié)構(gòu) DLL 有助于促進(jìn)模塊式程序的開(kāi)發(fā)。這可以幫助您開(kāi)發(fā)要求提供多個(gè)語(yǔ)言版本的大型程序或要求具有模塊式體系結(jié)構(gòu)的程序。模塊式程序的一個(gè)示例是具有多個(gè)可以在運(yùn)行時(shí)動(dòng)態(tài)加載的模塊的計(jì)帳程序。 ·簡(jiǎn)化部署和安裝 當(dāng) DLL 中的函數(shù)需要更新或修復(fù)時(shí),部署和安裝 DLL 不要求重新建立程序與該 DLL 的鏈接。此外,如果多個(gè)程序使用同一個(gè) DLL,那么多個(gè)程序都將從該更新或修復(fù)中獲益。當(dāng)您使用定期更新或修復(fù)的第三方 DLL 時(shí),此問(wèn)題可能會(huì)更頻繁地出現(xiàn)。 1、如何了解某應(yīng)用程序使用哪些DLL文件 右鍵單擊該應(yīng)用程序并選擇快捷菜單中的“快速查看”命令,在隨后出現(xiàn)的“快速查看”窗口的“引入表”一欄中你將看到其使用DLL文件的情況。 2、如何知道DLL文件被幾個(gè)程序使用 運(yùn)行Regedit,進(jìn)入HKEY_LOCAL_MACHINESoftwareMicrosrftWindowsCurrentVersionSharedDlls子鍵查看,其右邊窗口中就顯示了所有DLL文件及其相關(guān)數(shù)據(jù),其中數(shù)據(jù)右邊小括號(hào)內(nèi)的數(shù)字就說(shuō)明了被幾個(gè)程序使用,(2)表示被兩個(gè)程序使用,(0)則表示無(wú)程序使用,可以將其刪除。 3、如何解決DLL文件丟失的情況 有時(shí)在卸載文件時(shí)會(huì)提醒你刪除某個(gè)DLL文件可能會(huì)影響其他應(yīng)用程序的運(yùn)行。所以當(dāng)你卸載軟件時(shí),就有可能誤刪共享的DLL文件。一旦出現(xiàn)了丟失DLL文件的情況,如果你能確定其名稱(chēng),可以在Sysbckup(系統(tǒng)備份文件夾)中找到該DLL文件,將其復(fù)制到System文件夾中。如果這樣不行,在電腦啟動(dòng)時(shí)又總是出現(xiàn)“***dll文件丟失……”的提示框,你可以在“開(kāi)始/運(yùn)行”中運(yùn)行Msconfig,進(jìn)入系統(tǒng)配置實(shí)用程序?qū)υ捒蛞院?,單擊選擇“System.ini”標(biāo)簽,找出提示丟失的DLL文件,使其不被選中,這樣開(kāi)機(jī)時(shí)就不會(huì)出現(xiàn)錯(cuò)誤提示了。 rundll的功能是以命令列的方式呼叫Windows的動(dòng)態(tài)鏈結(jié)庫(kù)。 Rundll32.exe與Rundll.exe的區(qū)別就在于前者是呼叫32位的鏈結(jié)庫(kù),后者是用于16位的鏈結(jié)庫(kù)。rundll32.exe是專(zhuān)門(mén)用來(lái)調(diào)用dll文件的程序。 如果用的是Win98,rundll32.exe一般存在于Windows目錄下; 如果用的WinXP,rundll32.exe一般存在于WindowsSystem32目錄下。 若是在其它目錄,就可能是一個(gè)木馬程序,它會(huì)偽裝成rundll32.exe。 DLL 故障排除工具 可以使用多個(gè)工具來(lái)幫助您解決 DLL 問(wèn)題。以下是其中的部分工具。 Dependency Walker Dependency Walker 工具可以遞歸掃描以尋找程序所使用的所有依賴(lài) DLL。當(dāng)您在 Dependency Walker 中打開(kāi)程序時(shí),Dependency Walker 會(huì)執(zhí)行下列檢查: ·Dependency Walker 檢查是否丟失 DLL。 ·Dependency Walker 檢查是否存在無(wú)效的程序文件或 DLL。 ·Dependency Walker 檢查導(dǎo)入函數(shù)和導(dǎo)出函數(shù)是否匹配。 ·Dependency Walker 檢查是否存在循環(huán)依賴(lài)性錯(cuò)誤。 ·Dependency Walker 檢查是否存在由于針對(duì)另一不同操作系統(tǒng)而無(wú)效的模塊。 通過(guò)使用 Dependency Walker,您可以記錄程序使用的所有 DLL。這可能有助于避免和更正將來(lái)可能發(fā)生的 DLL 問(wèn)題。當(dāng)您安裝 Microsoft Visual Studio 6.0 時(shí),Dependency Walker 將位于以下目錄中: drive\Program Files\Microsoft Visual Studio\Common\Tools DLL Universal Problem Solver DLL Universal Problem Solver (DUPS) 工具用于審核、比較、記錄和顯示 DLL 信息。下表說(shuō)明了組成 DUPS 工具的實(shí)用工具: ·Dlister.exe:該實(shí)用工具枚舉計(jì)算機(jī)中的所有 DLL,并且將此信息記錄到一個(gè)文本文件或數(shù)據(jù)庫(kù)文件中。 ·Dcomp.exe:該實(shí)用工具比較在兩個(gè)文本文件中列出的 DLL,并產(chǎn)生包含差異的第三個(gè)文本文件。 ·Dtxt2DB.exe:該實(shí)用工具將通過(guò)使用 Dlister.exe 實(shí)用工具和 Dcomp.exe 實(shí)用工具創(chuàng)建的文本文件加載到 dllHell 數(shù)據(jù)庫(kù)中。 ·DlgDtxt2DB.exe:該實(shí)用工具提供 Dtxt2DB.exe 實(shí)用工具的圖形用戶(hù)界面 (GUI) 版本。 DLL 的類(lèi)型 當(dāng)您在應(yīng)用程序中加載 DLL 時(shí),可以使用兩種鏈接方法來(lái)調(diào)用導(dǎo)出的 DLL 函數(shù)。這兩種鏈接方法是加載時(shí)動(dòng)態(tài)鏈接和運(yùn)行時(shí)動(dòng)態(tài)鏈接。 1、加載時(shí)動(dòng)態(tài)鏈接 在加載時(shí)動(dòng)態(tài)鏈接中,應(yīng)用程序像調(diào)用本地函數(shù)一樣對(duì)導(dǎo)出的 DLL 函數(shù)進(jìn)行顯式調(diào)用。要使用加載時(shí)動(dòng)態(tài)鏈接,請(qǐng)?jiān)诰幾g和鏈接應(yīng)用程序時(shí)提供頭文件 (.h) 和導(dǎo)入庫(kù)文件 (.lib)。當(dāng)您這樣做時(shí),鏈接器將向系統(tǒng)提供加載 DLL 所需的信息,并在加載時(shí)解析導(dǎo)出的 DLL 函數(shù)的位置。 2、運(yùn)行時(shí)動(dòng)態(tài)鏈接 在運(yùn)行時(shí)動(dòng)態(tài)鏈接中,應(yīng)用程序調(diào)用 LoadLibrary 函數(shù)或 LoadLibraryEx 函數(shù)以在運(yùn)行時(shí)加載 DLL。成功加載 DLL 后,可以使用 GetProcAddress 函數(shù)獲得要調(diào)用的導(dǎo)出的 DLL 函數(shù)的地址。在使用運(yùn)行時(shí)動(dòng)態(tài)鏈接時(shí),無(wú)需使用導(dǎo)入庫(kù)文件。 Win32 DLL的特點(diǎn) Win32 DLL與 Win16 DLL有很大的區(qū)別,這主要是由操作系統(tǒng)的設(shè)計(jì)思想決定的。一方面,在Win16 DLL中程序入口點(diǎn)函數(shù)和出口點(diǎn)函數(shù)(LibMain和WEP)是分別實(shí)現(xiàn)的;而在Win32 DLL中卻由同一函數(shù)DLLMain來(lái)實(shí)現(xiàn)。無(wú)論何時(shí),當(dāng)一個(gè)進(jìn)程或線程載入和卸載DLL時(shí),都要調(diào)用該函數(shù),它的原型是 BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason, LPVOID lpvReserved); 其中,第一個(gè)參數(shù)表示DLL的實(shí)例句柄;第三個(gè)參數(shù)系統(tǒng)保留;這里主要介紹一下第二個(gè)參數(shù),它有四個(gè)可能的值:DLL_PROCESS_ATTACH(進(jìn)程載入),DLL_THREAD_ATTACH(線程載入),DLL_THREAD_DETACH(線程卸載),DLL_PROCESS_DETACH(進(jìn)程卸載),在DLLMain函數(shù)中可以對(duì)傳遞進(jìn)來(lái)的這個(gè)參數(shù)的值進(jìn)行判別,并根據(jù)不同的參數(shù)值對(duì)DLL進(jìn)行必要的初始化或清理工作。舉個(gè)例子來(lái)說(shuō),當(dāng)有一個(gè)進(jìn)程載入一個(gè)DLL時(shí),系統(tǒng)分派給DLL的第二個(gè)參數(shù)為DLL_PROCESS_ATTACH,這時(shí),你可以根據(jù)這個(gè)參數(shù)初始化特定的數(shù)據(jù)。另一方面,在Win16環(huán)境下,所有應(yīng)用程序都在同一地址空間;而在Win32環(huán)境下,所有應(yīng)用程序都有自己的私有空間,每個(gè)進(jìn)程的空間都是相互獨(dú)立的,這減少了應(yīng)用程序間的相互影響,但同時(shí)也增加了編程的難度。大家知道,在Win16環(huán)境中,DLL的全局?jǐn)?shù)據(jù)對(duì)每個(gè)載入它的進(jìn)程來(lái)說(shuō)都是相同的;而在Win32環(huán)境中,情況卻發(fā)生了變化,當(dāng)進(jìn)程在載入DLL時(shí),系統(tǒng)自動(dòng)把DLL地址映射到該進(jìn)程的私有空間,而且也復(fù)制該DLL的全局?jǐn)?shù)據(jù)的一份拷貝到該進(jìn)程空間,也就是說(shuō)每個(gè)進(jìn)程所擁有的相同的DLL的全局?jǐn)?shù)據(jù)其值卻并不一定是相同的。因此,在Win32環(huán)境下要想在多個(gè)進(jìn)程中共享數(shù)據(jù),就必須進(jìn)行必要的設(shè)置。亦即把這些需要共享的數(shù)據(jù)分離出來(lái),放置在一個(gè)獨(dú)立的數(shù)據(jù)段里,并把該段的屬性設(shè)置為共享。 |
|
來(lái)自: 陳石胡 > 《我的圖書(shū)館》