DLL 是 Dynamic Link Library 的縮寫,譯為“動態(tài)鏈接庫”。DLL也是一個(gè)被編譯過的二進(jìn)制程序,可以被其他程序調(diào)用,但與 exe 不同,DLL不能獨(dú)立運(yùn)行,必須由其他程序調(diào)用載入內(nèi)存。
DLL 中封裝了很多函數(shù),只要知道函數(shù)的入口地址,就可以被其他程序調(diào)用。
Windows API中所有的函數(shù)都包含在DLL中,其中有3個(gè)最重要的DLL:
- Kemel32.dll:它包含那些用于管理內(nèi)存、進(jìn)程和線程的函數(shù),例如CreateThread函數(shù);
- User32.dll:它包含那些用于執(zhí)行用戶界面任務(wù)(如窗口的創(chuàng)建和消息的傳送)的函數(shù),例如 CreateWindow 函數(shù);
- GDI32.dll:它包含那些用于畫圖和顯示文本的函數(shù)。
靜態(tài)鏈接庫和動態(tài)鏈接庫
1) 靜態(tài)庫
函數(shù)和數(shù)據(jù)被編譯進(jìn)一個(gè)二進(jìn)制文件(通常擴(kuò)展名為.LIB)。在使用靜態(tài)庫的情況下, 在編譯鏈接可執(zhí)行文件時(shí),鏈接器從庫中復(fù)制這些函數(shù)和數(shù)據(jù)并把它們和應(yīng)用程序的其他模塊組合起來創(chuàng)建最終的可執(zhí)行文件(.EXE文件)。當(dāng)發(fā)布產(chǎn)品時(shí),只需要發(fā)布這個(gè)可執(zhí)行文件,并不需要發(fā)布被使用的靜態(tài)庫。
2) 動態(tài)庫
在使用動態(tài)庫的時(shí)候,往往提供兩個(gè)文件:一個(gè)引入庫(.lib)文件和一個(gè)DLL (.dll) 文件。雖然引入庫的后綴名也是“l(fā)ib”,但是,動態(tài)庫的引入庫文件和靜態(tài)庫文件有著本質(zhì)上的區(qū)別,對一個(gè)DLL來說,其引入庫文件(.lib)包含該DLL導(dǎo)出的函數(shù)和變量的符號名,而.dll文件包含該DLL實(shí)際的函數(shù)和數(shù)據(jù)。在使用動態(tài)庫的情況下,在編譯鏈接可執(zhí)行文件時(shí),只需要鏈接該DLL的引入庫文件,該DLL中的函數(shù)代碼和數(shù)據(jù)并不復(fù)制到可執(zhí)行文件中,直到可執(zhí)行程序運(yùn)行時(shí),才去加載所需的DLL,將該DLL映射到進(jìn)程的地址空間中,然后訪問DLL中導(dǎo)出的函數(shù)。這時(shí),在發(fā)布產(chǎn)品時(shí),除了發(fā)布可執(zhí)行文件以外,同時(shí)還要發(fā)布該程序?qū)⒁{(diào)用的動態(tài)鏈接庫。
使用動態(tài)鏈接庫的好處
1) 可以采用多種編程語言來編寫
我們可以采用自己熟悉的開發(fā)語言編寫DLL,然后由其他語言編寫的可執(zhí)行程序來調(diào)用這些DLL。例如,可以利用VB來編寫程序的界面,然后調(diào)用利用VC++或Delphi編寫的完成程序業(yè)務(wù)邏輯的DLL。
2) 增強(qiáng)產(chǎn)品的功能
在發(fā)布產(chǎn)品時(shí),可以發(fā)布產(chǎn)品功能實(shí)現(xiàn)的動態(tài)鏈接庫規(guī)范,讓其他公司或個(gè)人遵照這個(gè)規(guī)范開發(fā)自己的DLL,以取代產(chǎn)品原有的DLL,讓產(chǎn)品調(diào)用新的DLL,從而實(shí)現(xiàn)功能 的增強(qiáng)。在實(shí)際工作中,我們看到許多產(chǎn)品都提供了界面插件功能,允許用戶動態(tài)地更換程序的界面,這就可以通過更換界面DLL來實(shí)現(xiàn)。
3) 提供二次開發(fā)的平臺
在銷售產(chǎn)品的同時(shí),可以采用DLL的形式提供一個(gè)二次開發(fā)的平臺,讓用戶可以利用該DLL調(diào)用其中實(shí)現(xiàn)的功能,編寫符合自己業(yè)務(wù)需要的產(chǎn)品,從而實(shí)現(xiàn)二次開發(fā)。
4) 簡化項(xiàng)目管理
在一個(gè)大型項(xiàng)目開發(fā)中,通常都是由多個(gè)項(xiàng)目小組同時(shí)開發(fā),如果采用串行開發(fā),則效率是非常低的。我們可以將項(xiàng)目細(xì)分,將不同功能交由各項(xiàng)目小組以多個(gè)DLL的方式實(shí)現(xiàn),這樣,各個(gè)項(xiàng)目小組就可以同時(shí)進(jìn)行開發(fā)了。
5) 可以節(jié)省磁盤空間和內(nèi)存
如果多個(gè)應(yīng)用程序需要訪問同樣的功能,那么可以將該功能以DLL的形式提供,這樣在機(jī)器上只需要存在一份該DLL文件就可以了,從而節(jié)省了磁盤空間。另外,如果多個(gè)應(yīng)用程序使用同一個(gè)DLL,該DLL只需要放入內(nèi)存一次,所有的應(yīng)用程序就都可以共亨它了。這樣,內(nèi)存的使用將更加有效。
我們知道,當(dāng)進(jìn)程被加載時(shí),系統(tǒng)會為它分配內(nèi)存,接著分析該可執(zhí)行模塊,找到該程序?qū)⒁{(diào)用哪些DLL,然后系統(tǒng)搜索這些DLL,找到后就加載它們,并為它們分配內(nèi)存空間。DLL的內(nèi)存空間只有一份,如果有第二個(gè)程序也需要加載該DLL,那么它們共享內(nèi)存空間,相同的DLL不會再次加載。
6) 有助于資源的共享
DLL可以包含對話框模板、字符串、圖標(biāo)和位圖等多種資源,多個(gè)應(yīng)用程序可以使用DLL來共享這些資源。在實(shí)際工作中,可以編寫一個(gè)純資源的動態(tài)鏈接庫,供其他應(yīng)用程序訪問。
7) 有助于實(shí)現(xiàn)應(yīng)用程序的本地化
如果產(chǎn)品需要提供多語言版本,那么就可以使用DLL來支持多語言??梢詾槊糠N語言創(chuàng)建一個(gè)只支持這種語言的動態(tài)鏈接庫。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點(diǎn)擊舉報(bào)。