資源描述:
《第九講 動(dòng)態(tài)鏈接庫》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、第九講動(dòng)態(tài)鏈接庫主講:呂駿動(dòng)態(tài)鏈接庫定義動(dòng)態(tài)鏈接庫(DynamicLinkLibrary,簡稱DLL)是一個(gè)包含了若干函數(shù)的可執(zhí)行模塊,它實(shí)質(zhì)上是一個(gè)函數(shù)包,Windows應(yīng)用程序可以調(diào)用這些函數(shù)來完成實(shí)際的任務(wù)。DLL在Windows環(huán)境中起著重要的作用——Windows利用DLL來建立Windows應(yīng)用程序可以使用的Windows函數(shù)與資源。動(dòng)態(tài)鏈接庫(DLL)是從C語言函數(shù)庫的概念發(fā)展而來的。幾乎所有的WindowsAPI都包含在DLL中動(dòng)態(tài)鏈接庫是一個(gè)文件,其中包含有函數(shù)或全局變量,使用他們就像應(yīng)用程序使用自己定義的函數(shù)一樣。用API開發(fā)Win
2、dows應(yīng)用程序,實(shí)質(zhì)就是調(diào)用Windows操作系統(tǒng)下的動(dòng)態(tài)鏈接庫。它包含函數(shù),數(shù)據(jù)或資源等其他應(yīng)用程序可用到的東西它可以在需要的時(shí)候隨時(shí)裝入,Windows操作系統(tǒng)都非常依賴于動(dòng)態(tài)鏈接庫(DLL)中的函數(shù)和數(shù)據(jù),實(shí)際上Windows操作系統(tǒng)中幾乎所有的內(nèi)容都由DLL以一種或另外一種形式代表著。我們?cè)赪indows目錄下的system32文件夾中會(huì)看到kernel32.dll、user32.dll和gdi32.dll,windows的大多數(shù)API都包含在這些DLL中。kernel32.dll中的函數(shù)主要處理內(nèi)存管理和進(jìn)程調(diào)度;user32.dll中的函
3、數(shù)主要控制用戶界面;gdi32.dll中的函數(shù)則負(fù)責(zé)圖形方面的操作。例如一般的程序員都用過類似MessageBox的函數(shù),其實(shí)它就包含在user32.dll這個(gè)動(dòng)態(tài)鏈接庫中。由此可見DLL對(duì)我們來說其實(shí)并不陌生。靜態(tài)鏈接與動(dòng)態(tài)鏈接DLL與運(yùn)行函數(shù)庫(如C語言的運(yùn)行函數(shù)庫)類似,二者主要區(qū)別在于庫代碼的鏈接時(shí)機(jī)不同。靜態(tài)鏈接庫在多任務(wù)環(huán)境中建立與運(yùn)行時(shí)效率可能很低。一方面,如果兩個(gè)應(yīng)用程序同時(shí)運(yùn)行,且它們使用了同一個(gè)靜態(tài)庫中的函數(shù),那么就要求系統(tǒng)中出現(xiàn)該函數(shù)的兩個(gè)副本,這顯然降低了內(nèi)存的使用效率。另一方面,對(duì)于比較復(fù)雜的問題,應(yīng)用靜態(tài)鏈接庫將導(dǎo)致最終
4、的應(yīng)用程序長度超過系統(tǒng)內(nèi)存而無法運(yùn)行。DLL是在運(yùn)行期間才被鏈接進(jìn)來,該操作由Windows操作系統(tǒng)自身來完成,而運(yùn)行函數(shù)庫則是在程序鏈接期間由應(yīng)用程序的鏈接器如LINK.EXE來完成,運(yùn)行函數(shù)庫的鏈接被稱為“靜態(tài)鏈接”,它把函數(shù)代碼鏈接到應(yīng)用程序中,增加了應(yīng)用程序最終執(zhí)行代碼的長度。它的主要優(yōu)點(diǎn)是建立了一個(gè)應(yīng)用程序可以利用的標(biāo)準(zhǔn)函數(shù)集。靜態(tài)鏈接庫多個(gè)應(yīng)用程序,多個(gè)靜態(tài)鏈接庫的副本占用較多的內(nèi)存資源在靜態(tài)庫情況下,函數(shù)和數(shù)據(jù)被編譯進(jìn)一個(gè)二進(jìn)制文件(通常擴(kuò)展名為*.LIB)VisualC++的編譯器在處理程序代碼時(shí)將從靜態(tài)庫中恢復(fù)這些函數(shù)和數(shù)據(jù)并把他們和
5、應(yīng)用程序中的其他模塊組合在一起生成可執(zhí)行文件"靜態(tài)鏈接",此時(shí)因?yàn)閼?yīng)用程序所需的全部內(nèi)容都是從庫中復(fù)制了出來,所以靜態(tài)庫本身并不需要與可執(zhí)行文件一起發(fā)行與靜態(tài)鏈接庫不同,動(dòng)態(tài)鏈接庫則允許若干個(gè)應(yīng)用程序共享某個(gè)函數(shù)的單個(gè)副本。事實(shí)上,每個(gè)WindowsAPI函數(shù),如GetMesssage()、CreateWindow()和TextOut()分別留于動(dòng)態(tài)鏈接庫——Kernel32.dll、User32.dll、Gdi32.dll之中。如果兩個(gè)應(yīng)用程序同時(shí)運(yùn)行,且都使用了某個(gè)特定的Windows函數(shù),那么它們將共享該函數(shù)代碼的單個(gè)副本。DLL除了實(shí)現(xiàn)代碼的共
6、享外,還可以實(shí)現(xiàn)其它資源的共享,如數(shù)據(jù)和硬件資源的共享。Windows的設(shè)備驅(qū)動(dòng)程序允許應(yīng)用程序共享硬件資源,這些設(shè)備驅(qū)動(dòng)程序就是以動(dòng)態(tài)鏈接庫的形式來出現(xiàn)。從某種程度上講,動(dòng)態(tài)鏈接庫也是一種類型的計(jì)算機(jī)資源。一個(gè)動(dòng)態(tài)鏈接庫可以為多個(gè)應(yīng)用程序使用,如果一個(gè)應(yīng)用程序使用了某個(gè)動(dòng)態(tài)鏈接庫中函數(shù),若庫不存在,則調(diào)用將不能完成。動(dòng)態(tài)鏈接庫DLL的優(yōu)點(diǎn)共享DLL,節(jié)省內(nèi)存,減少動(dòng)態(tài)交換不同程序設(shè)計(jì)語言之間可以共享DLL減少可執(zhí)行代碼大小重用代碼大工程可分為易管理的小工程實(shí)現(xiàn)新功能更容易、軟件升級(jí)在動(dòng)態(tài)庫的情況下,有兩個(gè)文件引入庫(.LIB)文件DLL文件引入庫文件
7、包含被DLL導(dǎo)出的函數(shù)的名稱和位置DLL包含實(shí)際的函數(shù)和數(shù)據(jù)應(yīng)用程序使用LIB文件鏈接到所需要使用的DLL文件隱式鏈接與顯式鏈接1.隱式鏈接若在代碼中沒有明確指定應(yīng)用程序要裝入的動(dòng)態(tài)鏈接庫,但卻使用其中的某個(gè)函數(shù),這種鏈接的方式稱為隱式鏈接。利用VC可以編寫各種DLL程序,其最終目的是在應(yīng)用程序中調(diào)用DLL。鏈接DLL到可執(zhí)行程序有兩種方式:隱式鏈接(Implicitlinking)顯式鏈接(Explicitlinking)2.顯式鏈接顯示鏈接,又稱顯式調(diào)用,是由編程者用API函數(shù)LoadLibrary()加載DLL、并通過GetProcessAddr
8、ess()來獲取應(yīng)用程序要調(diào)用的導(dǎo)出函數(shù)指針來調(diào)用DLL的導(dǎo)出函數(shù),最后通過FreeLibra