程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 詳細介紹dll文件是什麼

詳細介紹dll文件是什麼

編輯:C++入門知識

DLL是Dynamic Link Library的縮寫,意為動態鏈接庫。DLL文件一般被存放在C:WindowsSystem目錄下。DLL是一個包含可由多個程序同時使用的代碼和數據的庫。

在Windows中,許多應用程序並不是一個完整的可執行文件,它們被分割成一些相對獨立的動態鏈接庫,即DLL文件,放置於系統中。當我們執行某一個程序時,相應的DLL文件就會被調用。一個應用程序可有多個DLL 文件,一個DLL文件也可能被幾個應用程序所共用,這樣的DLL文件被稱為共享DLL文件。

例如,在 Windows 操作系統中,Comdlg32 DLL 執行與對話框有關的常見函數。因此,每個程序都可以使用該 DLL 中包含的功能來實現“打開”對話框。這有助於促進代碼重用和內存的有效使用。

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

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

Windows 操作系統中的一些作為 DLL 實現的文件

1、ActiveX 控件 (.ocx) 文件

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

2、控制面板 (.cpl) 文件

cpl 文件的一個示例是位於控制面板中的項。每個項都是一個專用 DLL。

3、設備驅動程序 (.drv) 文件

設備驅動程序的一個示例是控制打印到打印機的打印機驅動程序。

程序使用 DLL 的優點

1 使用較少的資源

當多個程序使用同一個函數庫時,DLL 可以減少在磁盤和物理內存中加載的代碼的重復量。這不僅可以大大影響在前台運行的程序,而且可以大大影響其他在 Windows 操作系統上運行的程序。

2 推廣模塊式體系結構

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

3 簡化部署和安裝

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

1、如何了解某應用程序使用哪些DLL文件

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

2、如何知道DLL文件被幾個程序使用

運行Regedit,進入 HKEY_LOCAL_MACHINESoftwareMicrosrftWindowsCurrentVersionSharedDlls子鍵查看,其右邊窗口中就顯示了所有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一般存在於WindowsSystem32目錄下。

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

DLL 故障排除工具

可以使用多個工具來幫助您解決 DLL 問題。以下是其中的部分工具。

1、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

2、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 的類型

當您在應用程序中加載 DLL 時,可以使用兩種鏈接方法來調用導出的 DLL 函數。這兩種鏈接方法是加載時動態鏈接和運行時動態鏈接。

1、加載時動態鏈接

在加載時動態鏈接中,應用程序像調用本地函數一樣對導出的 DLL 函數進行顯式調用。要使用加載時動態鏈接,請在編譯和鏈接應用程序時提供頭文件 (.h) 和導入庫文件 (.lib)。當您這樣做時,鏈接器將向系統提供加載 DLL 所需的信息,並在加載時解析導出的 DLL 函數的位置。

2、運行時動態鏈接

在運行時動態鏈接中,應用程序調用 LoadLibrary 函數或 LoadLibraryEx 函數以在運行時加載 DLL。成功加載 DLL 後,可以使用 GetProcAddress 函數獲得要調用的導出的 DLL 函數的地址。在使用運行時動態鏈接時,無需使用導入庫文件。

Win32 DLL的特點

Win32 DLL與 Win16 DLL有很大的區別,這主要是由操作系統的設計思想決定的。一方面,在Win16 DLL中程序入口點函數和出口點函數LibMain和WEP)是分別實現的;而在Win32 DLL中卻由同一函數DLLMain來實現。無論何時,當一個進程或線程載入和卸載DLL時,都要調用該函數,它的原型是

  1. 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文件有進一步的了解。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved