dll檔案

dll檔案

DLL檔案又稱"應用程式拓展",是軟體檔案類型。在Windows中,許多應用程式並不是一個完整的執行檔,它們被分割成一些相對獨立的動態程式庫,即DLL檔案,放置于系統中。當我們執行某一個程式時,相應的DLL檔案就會被調用。一個應用程式可使用多個DLL檔案,一個DLL檔案也可能被不同的應用程式使用,這樣的DLL檔案被稱為共享DLL檔案。

  • 中文名稱
    動態程式庫
  • 外文名稱
    Dynamic Link Library
  • 屬    性
    軟體檔案類型
  • 簡    稱
    DLL
  • 套用平台
    Windows

簡介

在Windows中,許多應用程式並不是一個完整的執行檔,它們被分割成一些相對獨立的動態程式庫,即DLL檔案,放置于系統中。當我們執行某一個程式時,相應的DLL檔案就會被調用。一個應用程式可有多個DLL檔案,一個DLL檔案也可能被幾個應用程式所共用,這樣的DLL檔案被稱為共享DLL檔案。例如,在 Windows作業系統中,Comdlg32 DLL 執行與對話框有關的常見函式。因此,每個程式都可以使用該 DLL 中包含的功能來實現“開啟”對話框。這有助于促進代碼重用和記憶體的有效使用。

dll檔案圖示dll檔案圖示

通過使用 DLL,程式可以實現模組化,由相對獨立的組件組成。例如,一個計帳程式可以按模組來銷售。可以在運行時將各個模組載入到主程式中(如果安裝了相應模組)。因為模組是彼此獨立的,所以程式的載入速度更快,而且模組隻在相應的功能被請求時才載入。

此外,可以更為容易地將更新套用于各個模組,而不會影響該程式的其他部分。例如,您可能具有一個工資計算程式,而稅率每年都會變更。當這些變更被隔離到 DLL 中以後,您無需重新生成或安裝整個程式就可以套用更新。

Windows作業系統中的一些作為 DLL 實現的檔案

·ActiveX控制項 (.ocx) 檔案

ActiveX控制項的一個示例是日歷控制項,它使您可以從日歷中選擇日期。

·控制臺 (.cpl) 檔案

.cpl 檔案的一個示例是位于控制臺中的項。每個項都是一個專用 DLL。

·設備驅動程式(.drv) 檔案

設備驅動程式的一個示例是控製列印到印表機的印表機驅動程式

優點

一、使用較少的資源

當多個程式使用同一個函式館時,DLL 可以減少在磁碟和物理記憶體中載入的代碼的重復量。這不僅可以大大影響在前台運行的程式,而且可以大大影響其他在 Windows作業系統上運行的程式。

二、推廣模組式體系結構

DLL 有助于促進模組式程式的開發。這可以幫助您開發要求提供多個語言版本的大型程式或要求具有模組式體系結構的程式。模組式程式的一個示例是具有多個可以在運行時動態載入的模組的計帳程式。

三、簡化部署和安裝

當 DLL 中的函式需要更新或修復時,部署和安裝 DLL 不要求重新增立程式與該 DLL 的連結。此外,如果多個程式使用同一個 DLL,那麽多個程式都將從該更新或修復中獲益。當您使用定期更新或修復的第三方 DLL 時,此問題可能會更頻繁地出現。

1、如何了解某應用程式使用哪些DLL檔案

右鍵單擊該應用程式並選擇快捷選單中的“快速查看”命令,在隨後出現的“快速查看”視窗的“引入表”一欄中你將看到其使用DLL檔案的情況。

2、如何知道DLL檔案被幾個程式使用

運行Regedit,進入HKEY_LOCAL_MACHINE/Software/Microsrft/Windows/CurrentVersion/SharedDlls子鍵查看,其右邊視窗中就顯示了所有DLL檔案及其相關資料,其中資料右邊小括弧內的數位就說明了被幾個程式使用,(2)表示被兩個程式使用,(0)則表示無程式使用,可以將其移除。

3、如何解決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目錄下;

如果用的WinXP,rundll32.exe一般存在于Windows\System32目錄下。

若是在其它目錄,就可能是一個木馬程式,它會偽裝成rundll32.exe。

故障排除

可以使用多個工具來幫助您解決 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檔案修復編輯

1、用Windows系統盤功能進行檔案修復;

2、若在此之前有一鍵備份過,可以重新還原;

3、從網上下載系統檔案然後覆蓋到原資料夾裏;

4、由于從網上下載系統檔案;

5、360安全衛士電腦診所——軟體問題——丟失dll檔案”,進入dll一鍵修復區,找到相應要修復的dll選項,點擊“立即修復”。

連結方法

當您在應用程式中載入 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環境下要想在多個進程中共享資料,就必須進行必要的設定。亦即把這些需要共享的資料分離出來,放置在一個獨立的資料段裏,並把該段的屬性設定為共享。

相關詞條

其它詞條