資源描述:
《動態(tài)鏈接庫編程》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、第12章動態(tài)鏈接庫編程在Windows操作系統(tǒng)環(huán)境中,動態(tài)鏈接庫技術(shù)有著廣泛的應(yīng)用。操作系統(tǒng)的核心功能、系統(tǒng)服務(wù)、應(yīng)用程序服務(wù)等多數(shù)是由一組動態(tài)鏈接庫實現(xiàn)的。在Windows應(yīng)用程序中使用動態(tài)鏈接庫有很多的好處。最主要的一點說是它可以使得多個應(yīng)用程序共享一段代碼,從而可以大幅度的降低應(yīng)用程序的資源開銷,同時很縮小了應(yīng)用程序的最終執(zhí)行代碼的大小。12.1基本概念在開發(fā)和使用動態(tài)鏈接庫之前,有必要了解一下動態(tài)鏈接庫的相關(guān)概念。只有了解了動態(tài)鏈接庫的結(jié)構(gòu)和工作機制,才能靈活有效地開發(fā)和使用它。12.1.1動態(tài)
2、鏈接庫的概念動態(tài)鏈接庫(DLL,Dynamic-LinkLibrary)也是一種可執(zhí)行文件,只不過它不能像普通的EXE文件那樣可以直接運行,而是用來為其它可執(zhí)行文件(包括EXE文件和其它DLL)提供共享函數(shù)庫。使用DLL的應(yīng)用程序可以調(diào)用DLL中的導(dǎo)出函數(shù),不過在應(yīng)用程序本身的執(zhí)行代碼中并不包含這些函數(shù)的執(zhí)行代碼,它們經(jīng)過編譯和鏈接之后,獨立的保存在DLL中。與動態(tài)鏈接庫相對應(yīng),還有一種稱為靜態(tài)連接庫的函數(shù)庫,二者的主要區(qū)別就是在使用方法上。12.1.2動態(tài)鏈接庫的優(yōu)點DLL在Windows編程中得到了
3、廣泛的應(yīng)用。WindowsAPI函數(shù)中的相當(dāng)部分就是由一組DLL所提供的,這些DLL從安裝Windows起就存在于系統(tǒng)中了。事實上,前面幾章早就在使用DLL進行編程了,只不過,所使用的DLL都是現(xiàn)成的,并且所有調(diào)用DLL的操作都由VisualC++的編譯和鏈接程序替用戶完成了。12.1.3VisualC++6.0可開發(fā)的DLLVisualC++6.0支持多種DLL,包括:非MFCDLL、靜態(tài)鏈接到MFC的常規(guī)DLL、動態(tài)鏈接到MFC的常規(guī)DLL和MFC擴展DLL。其中,非MFCDLL也稱為Win32DL
4、L,其內(nèi)部不采用MFC類庫結(jié)構(gòu),導(dǎo)出函數(shù)一般為標(biāo)準(zhǔn)的C接口。它能被非MFC或MFC編寫的應(yīng)用程序所調(diào)用。(具體內(nèi)容請參照本書)12.1.4DLL文件的組成一個發(fā)布的可供使用的動態(tài)鏈接庫,一般包含三個文件:包含文件(.H)、導(dǎo)入庫文件(.LIB)和實際代碼文件(.DLL)。(具體內(nèi)容請參照本書)12.2DLL的創(chuàng)建與調(diào)用本節(jié)以非MFCDLL(Win32DLL)為例來講解DLL的結(jié)構(gòu)和導(dǎo)出方法,并介紹創(chuàng)建和使用DLL的方法和步驟。12.2.1Win32DLL的創(chuàng)建與MFC應(yīng)用程序框架的創(chuàng)建相似,使用AppW
5、izard可以方便地創(chuàng)建一個Win32DLL框架。本節(jié)將利用AppWizard創(chuàng)建一個Win32DLL,該DLL提供了一個導(dǎo)出函數(shù)FactorialFun,實現(xiàn)正整數(shù)的階乘運算(如,5!=5*4*3*2*1)。(具體內(nèi)容請參照本書)12.2.2DLL的導(dǎo)出DLL文件和EXE文件都屬于可執(zhí)行文件,不同的是DLL文件包含了一個導(dǎo)出表,導(dǎo)出表中給出了可以從DLL中導(dǎo)出的所有函數(shù)的名字。外部可執(zhí)行程序只能訪問包括在DLL的導(dǎo)出表中的函數(shù),DLL中的其它函數(shù)是私有的,不能為外部可執(zhí)行程序所訪問。從DLL中導(dǎo)出函數(shù)
6、有兩種方法:在定義函數(shù)時使用關(guān)鍵字_declspec(dllexport);在創(chuàng)建DLL時使用模塊定義(.DEF)文件。(具體內(nèi)容請參照本書)12.2.3應(yīng)用程序鏈接DLL鏈接應(yīng)用程序到DLL也有兩種方法:隱式鏈接和顯式鏈接。隱式鏈接又稱為靜態(tài)加載。如果應(yīng)用程序使用了隱式鏈接,操作系統(tǒng)在加載應(yīng)用程序的同時加載應(yīng)用程序所使用的DLL。顯式鏈接又稱為動態(tài)加載。使用動態(tài)加載的應(yīng)用程序必須在代碼中明確的加載所使用的DLL,并使用指針來調(diào)用DLL中的導(dǎo)出函數(shù),在使用完畢之后,應(yīng)用程序必須卸載所使用的DLL。(具體
7、內(nèi)容請參照本書)12.3MFC常規(guī)DLL的創(chuàng)建與使用前面已經(jīng)介紹了普通DLL(Win32DLL)的開發(fā)和使用,下面將要介紹基于MFC的DLL的開發(fā)。MFCDLL能夠使用MFC類庫,從而能在MFC的幫助下開發(fā)出功能強大的模塊?;贛FC的DLL有MFC常規(guī)DLL和MFC擴展DLL,本節(jié)將介紹MFC常規(guī)DLL的創(chuàng)建與使用。12.3.1基本概念MFC常規(guī)DLL,顧名思義,其包含兩方面的含義。首先,它是MFCDLL,即可以在DLL的內(nèi)部使用MFC類庫。其次,它是常規(guī)的,即它不同于MFC擴展DLL,在其內(nèi)部雖然可
8、以使用MFC,但它與應(yīng)用程序的接口不能是MFC,如它不能導(dǎo)出一個MFC類的派生類。MFC常規(guī)DLL有兩種類型:靜態(tài)鏈接到MFC庫的規(guī)則DLL(RegularDLLwithMFCstaticallylinked)和動態(tài)鏈接到MFC庫的規(guī)則DLL(RegularDLLusingsharedMFCDLL)。從開發(fā)角度講,兩者的開發(fā)過程一樣的。(具體內(nèi)容請參照本書)12.3.2MFC常規(guī)DLL的創(chuàng)建同樣,使用AppWizard可以方便地創(chuàng)建一個MF