什麼是動態連結程式庫? 什麼是動態連結程式庫?
一、動態連結程式庫的概念
動態連結程式庫(Dynamic Link Library,縮寫為DLL)是一個可以被其它應用程式共用的程式模組,其中封裝了一些可以被共用的常式和資源。動態連結程式庫檔案的副檔名一般是dll, 也有可能是drv、sys和fon,它和可執行檔(exe)非常類似,區別在於DLL中雖然包含了可執行代碼卻不能單獨執行,而應由Windows應用 程式直接或間接調用。
動態連結是相對於靜態連結而言的。所謂靜態連結是指把要調用的函數或者過程連結到可執行檔中,成為可執行檔 的一部分。換句話說,函數和過程的代碼就在程式的exe檔案中,該檔案包含了運行時所需的全部代碼。當多個程式都調用相同函數時,記憶體中就會存在這個函數 的多個拷貝,這樣就浪費了寶貴的記憶體資源。而動態連結所調用的函數代碼並沒有被拷貝到應用程式的可執行檔中去,而是僅僅在其中加入了所調用函數的描述信 息(往往是一些重定位資訊)。僅當應用程式被裝入記憶體開始運行時,在Windows的管理下,才在應用程式與相應的DLL之間建立連結關係。當要執行所調 用DLL中的函數時,根據連結產生的重定位資訊,Windows才轉去執行DLL中相應的函數代碼。
一般情況下,如果一個應用程式使 用了動態連結程式庫,Win32系統保證記憶體中只有DLL的一份複製品,這是通過記憶體對應檔實現的。DLL首先被調入Win32系統的全域堆棧,然後映射到 調用這個DLL的進程地址空間。在Win32系統中,每個進程擁有自己的32位線性地址空間,如果一個DLL被多個進程調用,每個進程都會收到該DLL的 一份映像。與16位Windows不同,在Win32中DLL可以看作是每個進程自己的代碼。
二、動態連結程式庫的優點
1. 共用代碼、資源和資料
使用DLL的主要目的就是為了共用代碼,DLL的代碼可以被所有的Windows應用程式共用。
2. 隱藏實現的細節
DLL中的常式可以被應用程式訪問,而應用程式並不知道這些常式的細節。
3. 拓展開發工具如Delphi的功能
由於DLL是與語言無關的,因此可以建立一個DLL,被C++、VB或任何支援動態連結程式庫的語言調用。這樣如果一種語言存在不足,就可以通過訪問另一種語言建立的DLL來彌補。
三、動態連結程式庫的實現方法
1. Load-time Dynamic Linking
這種用法的前提是在編譯之前已經明確知道要調用DLL中的哪幾個函數,編譯時間在目標檔案中只保留必要的連結資訊,而不含DLL函數的代碼;當程式執行時,利用連結資訊載入DLL函數代碼並在記憶體中將其連結入調用程式的執行空間中,其主要目的是便於代碼共用。
2. Run-time Dynamic Linking
這種方式是指在編譯之前並不知道將會調用哪些DLL函數,完全是在運行過程中根據需要決定應調用哪個函數,並用LoadLibrary和GetProcAddress動態獲得DLL函數的入口地址。
教你認識動態連結程式庫DLL檔案
DLL是Dynamic Link Library的縮寫,意為動態連結程式庫。在Windows中,許多應用程式並不是一個完整的可執行檔,它們被分割成一些相對獨立的動態連結程式庫,即DLL 檔案,放置於系統中。當我們執行某一個程式時,相應的DLL檔案就會被調用。一個應用程式可有多個DLL檔案,一個DLL檔案也可能被幾個應用程式所共 用,這樣的DLL檔案被稱為共用DLL檔案。DLL檔案一般被存放在C:WindowsSystem目錄下。
1、如何瞭解某應用程式使用哪些DLL檔案
按右鍵該應用程式並選擇捷徑功能表中的“快速查看”命令,在隨後出現的“快速查看”視窗的“引入表”一欄中你將看到其使用DLL檔案的情況。
2、如何知道DLL檔案被幾個程式使用
運行Regedit,進入HKEY_LOCAL_MACHINESoftwareMicrosrftWindowsCurrent-
VersionSharedDlls子鍵查看,其右邊視窗中就顯示了所有DLL檔案及其相關資料,其中資料右邊小括弧內的數字就說明了被幾個程式使用,(2)表示被兩個程式使用,(0)則表示無程式使用,可以將其刪除。
3、如何解決DLL檔案丟失的情況
有時在卸載檔案時會提醒你刪除某個DLL檔案可能會影響其他應用程式的運行。所以當你卸載軟體時,就有可能誤刪共用的DLL檔案。一旦出現了丟失DLL 檔案的情況,如果你能確定其名稱,可以在Sysbckup(系統備份檔案夾)中找到該DLL檔案,將其複製到System檔案夾中。如果這樣不行,在電腦 啟動時又總是出現“***dll檔案丟失……”的提示框,你可以在“開始/運行”中運行Msconfig,進入系統配置公用程式對話方塊以後,單擊選擇 “System.ini”標籤,找出提示丟失的DLL檔案,使其不被選中,這樣開機時就不會出現錯誤提示了。