資源描述:
《《動態(tài)鏈接庫》ppt課件》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、第三篇VC編程高級篇——基于組件的編程與應(yīng)用VC不僅能進行結(jié)構(gòu)化的程序設(shè)計,還能進行面向?qū)ο蟮某绦蛟O(shè)計。基于組件的程序設(shè)計就是解決不同程序語言開發(fā)的程序差異而出現(xiàn)的一種程序設(shè)計方法。在VC程序中,不僅可以開發(fā)組件供自己或別的程序語言來調(diào)用,而且還可以使用別的程序語言開發(fā)的組件。本篇主要講解利用VC編制組件和調(diào)用組件的方法與原理,主要包括編制動態(tài)鏈接庫和COM組件、調(diào)用VC自己開發(fā)的動態(tài)鏈接庫和COM組件,以及結(jié)合數(shù)據(jù)庫應(yīng)用程序的開發(fā),闡述了如何使用Microsoft的ADO數(shù)據(jù)訪問組件來編寫高
2、效數(shù)據(jù)庫客戶端應(yīng)用程序。第13章動態(tài)鏈接庫13.1動態(tài)鏈接庫概述13.2動態(tài)鏈接庫的創(chuàng)建13.3動態(tài)鏈接庫的顯式調(diào)用習(xí)題13.1動態(tài)鏈接庫概述動態(tài)鏈接庫提供了一種代碼共享機制,它可以有效地減小程序文件的尺寸和不必要的重復(fù)工作。本章以一個包含遞歸分形樹函數(shù)的.DLL的建立為例,重點講解了動態(tài)鏈接庫的建立方法,在VC中顯式調(diào)用.Dll的方法。13.1.1動態(tài)鏈接庫定義13.1.2靜態(tài)鏈接與動態(tài)鏈接13.1.3函數(shù)的導(dǎo)出與導(dǎo)入13.1.4隱式鏈接與顯式鏈接13.1.5搜索動態(tài)鏈接庫*13.1.6使用動
3、態(tài)鏈接庫的優(yōu)點13.1.1動態(tài)鏈接庫定義動態(tài)鏈接庫(DynamicLinkLibrary,簡稱DLL)是一個包含了若干函數(shù)的可執(zhí)行模塊,它實質(zhì)上是一個函數(shù)包,Windows應(yīng)用程序可以調(diào)用這些函數(shù)來完成實際的任務(wù)。DLL在Windows環(huán)境中起著重要的作用——Windows利用DLL來建立Windows應(yīng)用程序可以使用的Windows函數(shù)與資源。動態(tài)鏈接庫是一個文件,其中包含有函數(shù)或全局變量,使用他們就像應(yīng)用程序使用自己定義的函數(shù)一樣。用API開發(fā)Windows應(yīng)用程序,實質(zhì)就是調(diào)用Window
4、s操作系統(tǒng)下的動態(tài)鏈接庫。13.1.2靜態(tài)鏈接與動態(tài)鏈接DLL與運行函數(shù)庫(如C語言的運行函數(shù)庫)類似,二者主要區(qū)別在于庫代碼的鏈接時機不同。靜態(tài)鏈接庫在多任務(wù)環(huán)境中建立與運行時效率可能很低。一方面,如果兩個應(yīng)用程序同時運行,且它們使用了同一個靜態(tài)庫中的函數(shù),那么就要求系統(tǒng)中出現(xiàn)該函數(shù)的兩個副本,這顯然降低了內(nèi)存的使用效率。另一方面,對于比較復(fù)雜的問題,應(yīng)用靜態(tài)鏈接庫將導(dǎo)致最終的應(yīng)用程序長度超過系統(tǒng)內(nèi)存而無法運行。DLL是在運行期間才被鏈接進來,該操作由Windows操作系統(tǒng)自身來完成,而運行函
5、數(shù)庫則是在程序鏈接期間由應(yīng)用程序的鏈接器如LINK.EXE來完成,運行函數(shù)庫的鏈接被稱為“靜態(tài)鏈接”,它把函數(shù)代碼鏈接到應(yīng)用程序中,增加了應(yīng)用程序最終執(zhí)行代碼的長度。它的主要優(yōu)點是建立了一個應(yīng)用程序可以利用的標(biāo)準(zhǔn)函數(shù)集,這樣在開發(fā)應(yīng)用程序時就無需包含函數(shù)庫中所包含的函數(shù)源代碼。13.1.2靜態(tài)鏈接與動態(tài)鏈接(續(xù))與靜態(tài)鏈接庫不同,動態(tài)鏈接庫則允許若干個應(yīng)用程序共享某個函數(shù)的單個副本。事實上,每個WindowsAPI函數(shù),如GetMesssage()、CreateWindow()和TextOut(
6、)分別留于動態(tài)鏈接庫——Kernel32.dll、User32.dll、Gdi32.dll之中。如果兩個應(yīng)用程序同時運行,且都使用了某個特定的Windows函數(shù),那么它們將共享該函數(shù)代碼的單個副本。DLL除了實現(xiàn)代碼的共享外,還可以實現(xiàn)其它資源的共享,如數(shù)據(jù)和硬件資源的共享。Windows的設(shè)備驅(qū)動程序允許應(yīng)用程序共享硬件資源,這些設(shè)備驅(qū)動程序就是以動態(tài)鏈接庫的形式來出現(xiàn)。從某種程度上講,動態(tài)鏈接庫也是一種類型的計算機資源。一個動態(tài)鏈接庫可以為多個應(yīng)用程序使用,如果一個應(yīng)用程序使用了某個動態(tài)鏈接
7、庫中函數(shù),若庫不存在,則調(diào)用將不能完成。13.1.3函數(shù)的導(dǎo)出與導(dǎo)入動態(tài)鏈接庫是一個.DLL文件,它存放在特定的位置上(13.1.5節(jié)講)。程序員所創(chuàng)建的動態(tài)鏈接庫中的函數(shù)要有導(dǎo)出標(biāo)志,在使用動態(tài)鏈接庫中的函數(shù)的程序中,要具有導(dǎo)入標(biāo)志。動態(tài)鏈接庫中的函數(shù)并不是雜亂無章地堆放在一起,它們都有一個標(biāo)志,即動態(tài)鏈接庫中的導(dǎo)出標(biāo)志。同樣,如果應(yīng)用程序要使用該庫中的函數(shù),也要向動態(tài)鏈接庫發(fā)出“是否有我們想要的函數(shù)”,這通過導(dǎo)入標(biāo)志來進行。雙方必須達成一致后才能使用。13.1.3函數(shù)的導(dǎo)出與導(dǎo)入(續(xù))1.通
8、過擴展關(guān)鍵字dllexport與dllimport指定從一個動態(tài)鏈接庫中導(dǎo)出一個函數(shù)可以通過如下的語句來完成__declspec(dllexport)voidMyFunction(inti){//動態(tài)鏈接庫中的函數(shù)MyFunction的實現(xiàn)代碼}其中__declspec是一個擴展關(guān)鍵字,其作用和具有一個參數(shù)的函數(shù)類似,實際上,它與它的“參數(shù)”一起構(gòu)成了一個“標(biāo)志”,即“__declspec(dllexport)”,該語句的含義為“出現(xiàn)在我后面的函數(shù)在當(dāng)前的動態(tài)鏈接庫文件中被合法導(dǎo)出,外部應(yīng)用程序