資源描述:
《MFC 教程 第13章動(dòng)態(tài)鏈接庫_課件.ppt》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、第13章動(dòng)態(tài)鏈接庫1本章主要內(nèi)容動(dòng)態(tài)連接庫的概念及其組成動(dòng)態(tài)連接庫的創(chuàng)建動(dòng)態(tài)連接庫的使用2概論先來闡述一下DLL(DynamicLinkableLibrary)的概念,你可以簡單的把DLL看成一種倉庫,它提供給你一些可以直接拿來用的變量、函數(shù)或類。在倉庫的發(fā)展史上經(jīng)歷了“無庫-靜態(tài)鏈接庫-動(dòng)態(tài)鏈接庫”的時(shí)代。靜態(tài)鏈接庫與動(dòng)態(tài)鏈接庫都是共享代碼的方式,如果采用靜態(tài)鏈接庫,則無論你愿不愿意,lib中的指令都被直接包含在最終生成的EXE文件中了。但是若使用DLL,該DLL不必被包含在最終EXE文件中,EXE文件執(zhí)行時(shí)可以“動(dòng)態(tài)”地引用和卸載這個(gè)與EX
2、E獨(dú)立的DLL文件。靜態(tài)鏈接庫和動(dòng)態(tài)鏈接庫的另外一個(gè)區(qū)別在于靜態(tài)鏈接庫中不能再包含其他的動(dòng)態(tài)鏈接庫或者靜態(tài)庫,而在動(dòng)態(tài)鏈接庫中還可以再包含其他的動(dòng)態(tài)或靜態(tài)鏈接庫。3對(duì)動(dòng)態(tài)鏈接庫,我們還需建立如下概念:(1)DLL的編制與具體的編程語言及編譯器無關(guān) 只要遵循約定的DLL接口規(guī)范和調(diào)用方式,用各種語言編寫的DLL都可以相互調(diào)用。譬如Windows提供的系統(tǒng)DLL(其中包括了Windows的API),在任何開發(fā)環(huán)境中都能被調(diào)用,不在乎其是VisualBasic、VisualC++還是Delphi。4(2)動(dòng)態(tài)鏈接庫隨處可見 我們在Windo
3、ws目錄下的system32文件夾中會(huì)看到kernel32.dll、user32.dll和gdi32.dll,windows的大多數(shù)API都包含在這些DLL中。kernel32.dll中的函數(shù)主要處理內(nèi)存管理和進(jìn)程調(diào)度;user32.dll中的函數(shù)主要控制用戶界面;gdi32.dll中的函數(shù)則負(fù)責(zé)圖形方面的操作5(3)VC動(dòng)態(tài)鏈接庫的分類 VisualC++支持三種DLL,它們分別是Non-MFCDLL(非MFC動(dòng)態(tài)庫)、MFCRegularDLL(MFC規(guī)則DLL)、MFCExtensionDLL(MFC擴(kuò)展DLL)。 非MFC動(dòng)
4、態(tài)庫不采用MFC類庫結(jié)構(gòu),其導(dǎo)出函數(shù)為標(biāo)準(zhǔn)的C接口,能被非MFC或MFC編寫的應(yīng)用程序所調(diào)用;MFC規(guī)則DLL包含一個(gè)繼承自CWinApp的類,但其無消息循環(huán);MFC擴(kuò)展DLL采用MFC的動(dòng)態(tài)鏈接版本創(chuàng)建,它只能被用MFC類庫所編寫的應(yīng)用程序所調(diào)用。613.1動(dòng)態(tài)鏈接庫的基本概念Windows使用DLL實(shí)現(xiàn)程序模塊共享。其特點(diǎn)是:動(dòng)態(tài)鏈接的;公用的;自動(dòng)卸載。DLL由全局?jǐn)?shù)據(jù)、可導(dǎo)出函數(shù)、類和資源組成。主要任務(wù):為使用它的各應(yīng)用程序提供可調(diào)用的導(dǎo)出函數(shù)7根據(jù)編寫規(guī)范,Windows必須查找并執(zhí)行DLL里的DllMain函數(shù)作為加載DLL的依據(jù),
5、它使得DLL得以保留在內(nèi)存里。這個(gè)函數(shù)并不屬于導(dǎo)出函數(shù),而是DLL的內(nèi)部函數(shù)。這意味著不能直接在應(yīng)用工程中引用DllMain函數(shù),DllMain是自動(dòng)被調(diào)用的。8動(dòng)態(tài)鏈接庫的入口函數(shù)BOOLAPIENTRYDllMain(HANDLEhModule,//指向Dll本身的句柄DWORDul_reason_for_call,//Dll被調(diào)用的原因LPVOIDlpReserved)//系統(tǒng)所保留的參數(shù){//可以在這里編寫DLL的初始化代碼returnTRUE;}13.1動(dòng)態(tài)鏈接庫的基本概念9DllMain函數(shù)在DLL被加載和卸載時(shí)被調(diào)用,在單個(gè)線程啟
6、動(dòng)和終止時(shí),DLLMain函數(shù)也被調(diào)用,ul_reason_for_call指明了被調(diào)用的原因。原因共有4種,即PROCESS_ATTACH、PROCESS_DETACH、THREAD_ATTACH和THREAD_DETACH,以switch語句列出。10BOOLAPIENTRYDllMain(HANDLEhModule,DWORDul_reason_for_call,LPVOIDlpReserved){ switch(ul_reason_for_call) { caseDLL_PROCESS_ATTACH: …caseDL
7、L_THREAD_ATTACH: …caseDLL_THREAD_DETACH: …caseDLL_PROCESS_DETACH: … } returnTRUE;}11導(dǎo)出函數(shù)和內(nèi)部函數(shù)DLL中定義的供外部應(yīng)用程序調(diào)用的函數(shù),叫做導(dǎo)出函數(shù)(export?function);只為在DLL內(nèi)部調(diào)用的函數(shù)叫做內(nèi)部函數(shù)(internal?function);導(dǎo)出函數(shù)在客戶端叫做導(dǎo)入函數(shù)。13.1動(dòng)態(tài)鏈接庫的基本概念1213.2動(dòng)態(tài)鏈接庫的創(chuàng)建設(shè)計(jì)DLL的主要工作是編寫庫中的函數(shù),方法與編寫一般函數(shù)的方法基本相同。但要對(duì)庫中的函數(shù)進(jìn)
8、行必要的聲明,說明哪些函數(shù)是可以導(dǎo)出的,哪些不可以.聲明DLL導(dǎo)出函數(shù)有兩種方法:在.def文件中聲明;使用關(guān)鍵字_declspec(dllexpor