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