DLL 是 Dynamic Link Library 的縮寫,譯爲「動態連接庫」。DLL也是一個被編譯過的二進制程序,能夠被其餘程序調用,但與 exe 不一樣,DLL不能獨立運行,必須由其餘程序調用載入內存。
DLL 中封裝了不少函數,只要知道函數的入口地址,就能夠被其餘程序調用。
Windows API中全部的函數都包含在DLL中,其中有3個最重要的DLL:
- Kemel32.dll:它包含那些用於管理內存、進程和線程的函數,例如CreateThread函數;
- User32.dll:它包含那些用於執行用戶界面任務(如窗口的建立和消息的傳送)的函數,例如 CreateWindow 函數;
- GDI32.dll:它包含那些用於畫圖和顯示文本的函數。
靜態連接庫和動態連接庫
1) 靜態庫
函數和數據被編譯進一個二進制文件(一般擴展名爲.LIB)。在使用靜態庫的狀況下, 在編譯連接可執行文件時,連接器從庫中複製這些函數和數據並把它們和應用程序的其餘模塊組合起來建立最終的可執行文件(.EXE文件)。當發佈產品時,只須要發佈這個可執行文件,並不須要發佈被使用的靜態庫。
2) 動態庫
在使用動態庫的時候,每每提供兩個文件:一個引入庫(.lib)文件和一個DLL (.dll) 文件。雖然引入庫的後綴名也是「lib」,可是,動態庫的引入庫文件和靜態庫文件有着本質上的區別,對一個DLL來講,其引入庫文件(.lib)包含該DLL導出的函數和變量的符號名,而.dll文件包含該DLL實際的函數和數據。在使用動態庫的狀況下,在編譯連接可執行文件時,只須要連接該DLL的引入庫文件,該DLL中的函數代碼和數據並不複製到可執行文件中,直到可執行程序運行時,纔去加載所需的DLL,將該DLL映射到進程的地址空間中,而後訪問DLL中導出的函數。這時,在發佈產品時,除了發佈可執行文件之外,同時還要發佈該程序將要調用的動態連接庫。
也能夠這樣理解,(.lib)至關於咱們前邊多文件編譯的(fun.h),(.dll)至關於(fun.c)....
使用動態連接庫的好處
1) 能夠採用多種編程語言來編寫
咱們能夠採用本身熟悉的開發語言編寫DLL,而後由其餘語言編寫的可執行程序來調用這些DLL。例如,能夠利用VB來編寫程序的界面,而後調用利用VC++或Delphi編寫的完成程序業務邏輯的DLL。
2) 加強產品的功能
在發佈產品時,能夠發佈產品功能實現的動態連接庫規範,讓其餘公司或我的遵守這個規範開發本身的DLL,以取代產品原有的DLL,讓產品調用新的DLL,從而實現功能 的加強。在實際工做中,咱們看到許多產品都提供了界面插件功能,容許用戶動態地更換程序的界面,這就能夠經過更換界面DLL來實現。
3) 提供二次開發的平臺
在銷售產品的同時,能夠採用DLL的形式提供一個二次開發的平臺,讓用戶能夠利用該DLL調用其中實現的功能,編寫符合本身業務須要的產品,從而實現二次開發。
4) 簡化項目管理
在一個大型項目開發中,一般都是由多個項目小組同時開發,若是採用串行開發,則效率是很是低的。咱們能夠將項目細分,將不一樣功能交由各項目小組以多個DLL的方式實現,這樣,各個項目小組就能夠同時進行開發了。
5) 能夠節省磁盤空間和內存
若是多個應用程序須要訪問一樣的功能,那麼能夠將該功能以DLL的形式提供,這樣在機器上只須要存在一份該DLL文件就能夠了,從而節省了磁盤空間。另外,若是多個應用程序使用同一個DLL,該DLL只須要放入內存一次,全部的應用程序就均可以共亨它了。這樣,內存的使用將更加有效。
咱們知道,當進程被加載時,系統會爲它分配內存,接着分析該可執行模塊,找到該程序將要調用哪些DLL,而後系統搜索這些DLL,找到後就加載它們,併爲它們分配內存空間。DLL的內存空間只有一份,若是有第二個程序也須要加載該DLL,那麼它們共享內存空間,相同的DLL不會再次加載。
6) 有助於資源的共享
DLL能夠包含對話框模板、字符串、圖標和位圖等多種資源,多個應用程序可使用DLL來共享這些資源。在實際工做中,能夠編寫一個純資源的動態連接庫,供其餘應用程序訪問。
7) 有助於實現應用程序的本地化
若是產品須要提供多語言版本,那麼就可使用DLL來支持多語言。能夠爲每種語言建立一個只支持這種語言的動態連接庫。