




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、1第第13章章 動(dòng)態(tài)鏈接庫(kù)動(dòng)態(tài)鏈接庫(kù)2本章主要內(nèi)容 n動(dòng)態(tài)連接庫(kù)的概念及其組成n動(dòng)態(tài)連接庫(kù)的創(chuàng)建n動(dòng)態(tài)連接庫(kù)的使用3概論概論 先來(lái)闡述一下DLL(Dynamic Linkable Library)的概念,你可以簡(jiǎn)單的把DLL看成一種倉(cāng)庫(kù),它提供給你一些可以直接拿來(lái)用的變量、函數(shù)或類。在倉(cāng)庫(kù)的發(fā)展史上經(jīng)歷了“無(wú)庫(kù)靜態(tài)鏈接庫(kù)動(dòng)態(tài)鏈接庫(kù)”的時(shí)代。靜態(tài)鏈接庫(kù)與動(dòng)態(tài)鏈接庫(kù)都是共享代碼的方式,如果采用靜態(tài)鏈接庫(kù),則無(wú)論你愿不愿意,lib中的指令都被直接包含在最終生成的EXE文件中了。但是若使用DLL,該DLL不必被包含在最終EXE文件中,EXE文件執(zhí)行時(shí)可以“動(dòng)態(tài)”地引用和卸載這個(gè)與EXE獨(dú)立的DLL文件
2、。靜態(tài)鏈接庫(kù)和動(dòng)態(tài)鏈接庫(kù)的另外一個(gè)區(qū)別在于靜態(tài)鏈接庫(kù)中不能再包含其他的動(dòng)態(tài)鏈接庫(kù)或者靜態(tài)庫(kù),而在動(dòng)態(tài)鏈接庫(kù)中還可以再包含其他的動(dòng)態(tài)或靜態(tài)鏈接庫(kù)。4對(duì)動(dòng)態(tài)鏈接庫(kù),我們還需建立如下概念:(1)DLL 的編制與具體的編程語(yǔ)言及編譯器無(wú)關(guān)只要遵循約定的DLL接口規(guī)范和調(diào)用方式,用各種語(yǔ)言編寫(xiě)的DLL都可以相互調(diào)用。譬如Windows提供的系統(tǒng)DLL(其中包括了Windows的API),在任何開(kāi)發(fā)環(huán)境中都能被調(diào)用,不在乎其是Visual Basic、Visual C+還是Delphi。5(2)動(dòng)態(tài)鏈接庫(kù)隨處可見(jiàn)我們?cè)赪indows目錄下的system32文件夾中會(huì)看到kernel32.dll、user3
3、2.dll和gdi32.dll,windows的大多數(shù)API都包含在這些DLL中。kernel32.dll中的函數(shù)主要處理內(nèi)存管理和進(jìn)程調(diào)度;user32.dll中的函數(shù)主要控制用戶界面;gdi32.dll中的函數(shù)則負(fù)責(zé)圖形方面的操作 6(3)VC動(dòng)態(tài)鏈接庫(kù)的分類Visual C+支持三種DLL,它們分別是Non-MFC DLL(非MFC動(dòng)態(tài)庫(kù))、MFC Regular DLL(MFC規(guī)則DLL)、MFC Extension DLL(MFC擴(kuò)展DLL)。非MFC動(dòng)態(tài)庫(kù)不采用MFC類庫(kù)結(jié)構(gòu),其導(dǎo)出函數(shù)為標(biāo)準(zhǔn)的C接口,能被非MFC或MFC編寫(xiě)的應(yīng)用程序所調(diào)用;MFC規(guī)則DLL 包含一個(gè)繼承自CWi
4、nApp的類,但其無(wú)消息循環(huán);MFC擴(kuò)展DLL采用MFC的動(dòng)態(tài)鏈接版本創(chuàng)建,它只能被用MFC類庫(kù)所編寫(xiě)的應(yīng)用程序所調(diào)用。 713.1 動(dòng)態(tài)鏈接庫(kù)的基本概念動(dòng)態(tài)鏈接庫(kù)的基本概念nWindows 使用DLL實(shí)現(xiàn)程序模塊共享。n其特點(diǎn)是:動(dòng)態(tài)鏈接的;公用的;自動(dòng)卸載。nDLL由全局?jǐn)?shù)據(jù)、可導(dǎo)出函數(shù)、類和資源組成。主要任務(wù):為使用它的各應(yīng)用程序提供可調(diào)用的導(dǎo)出函數(shù)8根據(jù)編寫(xiě)規(guī)范,Windows必須查找并執(zhí)行DLL里的DllMain函數(shù)作為加載DLL的依據(jù),它使得DLL得以保留在內(nèi)存里。這個(gè)函數(shù)并不屬于導(dǎo)出函數(shù),而是DLL的內(nèi)部函數(shù)。這意味著不能直接在應(yīng)用工程中引用DllMain函數(shù),DllMain是自
5、動(dòng)被調(diào)用的。9n動(dòng)態(tài)鏈接庫(kù)的入口函數(shù)動(dòng)態(tài)鏈接庫(kù)的入口函數(shù)BOOL APIENTRY DllMain( HANDLE hModule, /指向Dll本身的句柄 DWORD ul_reason_for_call, /Dll被調(diào)用的原因 LPVOID lpReserved )/系統(tǒng)所保留的參數(shù)/可以在這里編寫(xiě)DLL的初始化代碼 return TRUE;13.1動(dòng)態(tài)鏈接庫(kù)的基本概念動(dòng)態(tài)鏈接庫(kù)的基本概念10 DllMain函數(shù)在DLL被加載和卸載時(shí)被調(diào)用,在單個(gè)線程啟動(dòng)和終止時(shí),DLLMain函數(shù)也被調(diào)用,ul_reason_for_call指明了被調(diào)用的原因。原因共有4種,即PROCESS_ATTAC
6、H、PROCESS_DETACH、THREAD_ATTACH和THREAD_DETACH,以switch語(yǔ)句列出。 11BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)switch (ul_reason_for_call)case DLL_PROCESS_ATTACH:case DLL_THREAD_ATTACH:case DLL_THREAD_DETACH:case DLL_PROCESS_DETACH:return TRUE; 12n導(dǎo)出函數(shù)和內(nèi)部函數(shù)導(dǎo)出函數(shù)和內(nèi)部函數(shù)uD
7、LL中定義的供外部應(yīng)用程序調(diào)用的函數(shù),叫做導(dǎo)出函數(shù)(export function);u只 為 在 D L L 內(nèi) 部 調(diào) 用 的 函 數(shù) 叫 做 內(nèi) 部 函 數(shù)(internal function);u導(dǎo)出函數(shù)在客戶端叫做導(dǎo)入函數(shù)。13.1動(dòng)態(tài)鏈接庫(kù)的基本概念動(dòng)態(tài)鏈接庫(kù)的基本概念1313.2動(dòng)態(tài)鏈接庫(kù)的創(chuàng)建動(dòng)態(tài)鏈接庫(kù)的創(chuàng)建n 設(shè)計(jì)DLL的主要工作是編寫(xiě)庫(kù)中的函數(shù),方法與編寫(xiě)一般函數(shù)的方法基本相同。但要對(duì)庫(kù)中的函數(shù)進(jìn)行必要的聲明,說(shuō)明哪些函數(shù)是可以導(dǎo)出的,哪些不可以.n 聲明DLL導(dǎo)出函數(shù)有兩種方法: 在.def文件中聲明; 使用關(guān)鍵字_declspec(dllexport)來(lái)聲明。14n使用
8、使用def文件聲明導(dǎo)出函數(shù)文件聲明導(dǎo)出函數(shù)def文件又叫做模塊定義文件,是用于描述DLL屬性的文本文件。def文件一般包括以下模塊定義語(yǔ)句:LIBRARY語(yǔ)句,指出DLL的名字。EXPORTS語(yǔ)句,列出庫(kù)中導(dǎo)出函數(shù)的名稱及導(dǎo)出函數(shù)的序號(hào)(可選)。DISCRIPTION語(yǔ)句,描述DLL的用途等說(shuō)明。13.2動(dòng)態(tài)鏈接庫(kù)的創(chuàng)建動(dòng)態(tài)鏈接庫(kù)的創(chuàng)建15例如 ; DLL名字為SampleLIBRARY Sample; 函數(shù)ShowMe為導(dǎo)出函數(shù)EXPORTS ShowMe ;def文件結(jié)束13.2動(dòng)態(tài)鏈接庫(kù)的創(chuàng)建動(dòng)態(tài)鏈接庫(kù)的創(chuàng)建16u在創(chuàng)建DLL時(shí),編譯鏈接器先使用def文件創(chuàng)建兩個(gè)文件:一個(gè)導(dǎo)出文件(.E
9、XP)和一個(gè)導(dǎo)入庫(kù)文件(.LIB),然后使用導(dǎo)出文件再創(chuàng)建DLL文件。u導(dǎo)入庫(kù)文件中存放了外部應(yīng)用程序可導(dǎo)入的DLL導(dǎo)出函數(shù)名稱的列表,函數(shù)的代碼則存放在DLL文件中。u外部應(yīng)用程序使用的文件是導(dǎo)入庫(kù)文件和DLL文件。13.2動(dòng)態(tài)鏈接庫(kù)的創(chuàng)建動(dòng)態(tài)鏈接庫(kù)的創(chuàng)建17例13-1n創(chuàng)建一個(gè)Dll,在應(yīng)用程序中調(diào)用它提供的ShowHello函數(shù)時(shí),將彈出一個(gè)消息框,該消息框的信息為”Hello, World!”1)使用MFC AppWizard創(chuàng)建一個(gè)空的Win32Dynamic-Link Library工程,工程名為MFCexp13_1dll.2)在工程中新建一個(gè)文本文件,名為MFCexp13_1dl
10、l.def,輸入以下代碼:18;DLL的名稱LIBRARY MFCexp13_1dll; 聲明ShowHello為導(dǎo)出函數(shù)EXPORTS ShowHello;def文件結(jié)束19新建一個(gè)源文件MFCexp13_1dll.cpp,并在文件中添加如下代碼:#include BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) return TRUE;int ShowHello(void)/需要導(dǎo)出的函數(shù)MessageBox(NULL,Hello World!,MB_YESNO);ret
11、urn TRUE;20n使用關(guān)鍵字使用關(guān)鍵字_declspec(dllexport)聲明導(dǎo)出函數(shù)聲明導(dǎo)出函數(shù)例 如 , 聲 明 函 數(shù) S h o w M s g 為 導(dǎo) 出 函 數(shù) 。_declspec(dllexport) int ShowMsg(int s);/導(dǎo)出C格式的函數(shù)(用C+編寫(xiě)的DLL函數(shù))extern“C” _declspec(dllexport) int ShowMsg(int s);13.2動(dòng)態(tài)鏈接庫(kù)的創(chuàng)建動(dòng)態(tài)鏈接庫(kù)的創(chuàng)建21例13-2 重寫(xiě)13-1,用_declspec(dllexport)來(lái)聲明導(dǎo)出函數(shù)2213.2動(dòng)態(tài)鏈接庫(kù)的創(chuàng)建動(dòng)態(tài)鏈接庫(kù)的創(chuàng)建n用MFC編寫(xiě)DLL
12、在VC+中還可以使用MFC來(lái)編寫(xiě)DLL。MFC支持兩種形式的DLL:常規(guī)型DLL和擴(kuò)展型DLL。nMFC常規(guī)型常規(guī)型DLLu常規(guī)型DLL可用于MFC應(yīng)用程序和非MFC應(yīng)用程序。用MFC AppWizard創(chuàng)建MFC DLL框架時(shí),在New對(duì)話框中的Projects選項(xiàng)卡中選擇MFC AppWizard(dll)選項(xiàng),在出現(xiàn)的對(duì)話框中選擇創(chuàng)建常規(guī)型DLL即可。uMFC把DLL的入口函數(shù)DLLMain封裝在CWinApp中。u導(dǎo)出項(xiàng)目要使用關(guān)鍵字_declspec(dllexport)來(lái)說(shuō)明。23例13-3n創(chuàng)建一個(gè)常規(guī)型DLL,它可以提供一個(gè)導(dǎo)出函數(shù)ShowMsg,當(dāng)應(yīng)用程序調(diào)用它時(shí),將會(huì)顯示一
13、個(gè)消息框,該消息框上顯示字符串”MFC”241.創(chuàng)建一個(gè)常規(guī)DLL,在頭文件中添加如下代碼:_declspec(dllexport)int ShowMsg();2.在源文件中添加如下代碼:_declspec(dllexport) int ShowMsg(void)char*msg=MFC;:MessageBox(NULL,msg,MB_OK);return 1;253.修改.def文件; MFCexp13_3dll.def : Declares the module parameters for the DLL.LIBRARY MFCexp13_3dllDESCRIPTION MFCexp13
14、_3dll Windows Dynamic Link LibraryEXPORTS ; Explicit exports can go hereShowMsg2613.2動(dòng)態(tài)鏈接庫(kù)的創(chuàng)建動(dòng)態(tài)鏈接庫(kù)的創(chuàng)建nMFC擴(kuò)展型擴(kuò)展型DLLu擴(kuò)展型DLL可以導(dǎo)出MFC的繼承類。u在 擴(kuò) 展 型 D L L 中 , 在 類 的 名 稱 前 面 加 宏AFX_EXT_CLASS,就可以把一個(gè)MFC繼承類聲明為導(dǎo)出類。例如:calss AFX_EXT_CLASS CMyDllClass:public CObject;27n注意:一個(gè)擴(kuò)展DLL只能與MFC采用動(dòng)態(tài)聯(lián)編方式鏈接并且只能被MFC應(yīng)用程序使用.n例13
15、-4創(chuàng)建一個(gè)MFC擴(kuò)展DLL,它可以輸出一個(gè)自定義的對(duì)話框.28n應(yīng)用程序使用DLL的導(dǎo)出函數(shù)有兩種方式:隱式鏈接;顯式鏈接。n隱式鏈接方式需要使用DLL的應(yīng)用程序把該DLL的導(dǎo)入文件加到應(yīng)用程序的項(xiàng)目中。應(yīng)用程序運(yùn)行時(shí),Windows會(huì)根據(jù)導(dǎo)入文件提供的信息加載DLL,應(yīng)用程序通過(guò)函數(shù)名實(shí)現(xiàn)對(duì)DLL函數(shù)的動(dòng)態(tài)鏈接。由于在程序中沒(méi)有出現(xiàn)加載DLL的代碼,所以把這種鏈接方式叫做隱式鏈接。13.3動(dòng)態(tài)鏈接庫(kù)的使用動(dòng)態(tài)鏈接庫(kù)的使用29nWindows搜索DLL的順序?yàn)?1)包含應(yīng)用程序EXE文件的目錄2)進(jìn)程的當(dāng)前工作目錄3)Windows系統(tǒng)目錄4)Windows目錄5)列在Path環(huán)境變量中的一
16、系列目錄3013.3動(dòng)態(tài)鏈接庫(kù)的使用動(dòng)態(tài)鏈接庫(kù)的使用n顯式鏈接方式在應(yīng)用程序中使用Windows API函數(shù)直接完成DLL加載及函數(shù)調(diào)用,稱為DLL的顯式鏈接方式。具體步驟如下:獲得DLL庫(kù)獲得DLL 函數(shù)釋放DLL庫(kù)31n1)獲得DLL庫(kù)通過(guò)調(diào)用Win32的LoadLibrary函數(shù),并以要使用的DLL文件所在的路徑為參數(shù),可以取得DLL.HINSTANCE LoadLibrary(LPCTSTR lpLibFileName);函數(shù)返回值為DLL庫(kù)的句柄.32n獲得DLL 函數(shù)獲得DLL的句柄后,調(diào)用GetProcAddress來(lái)獲得該DLL中與導(dǎo)入函數(shù)相匹配的導(dǎo)出函數(shù).FARPROC Ge
17、tProcAddress(HMODULE hModule,LPCSTR lpProcName);返回值為DLL導(dǎo)出函數(shù)的地址.33n釋放DLL庫(kù)使用完DLL后,必須用FreeLibrary函數(shù)釋放動(dòng)態(tài)連接庫(kù).BOOL FreeLibrary(HMODULE hLibModule /DLL句柄);34n例13-5 創(chuàng)建一個(gè)應(yīng)用程序,在該程序采用顯式鏈接方式調(diào)用例13-3的DLL導(dǎo)出函數(shù)ShowMsg時(shí),該導(dǎo)出函數(shù)可以顯示一個(gè)對(duì)話框.35例如:typedef void (TESTDLL)();HINSTANCE hDllInst;/獲得DLL庫(kù)hDllInst=:LoadLibrary (”test.dll);if(hDllInst=NULL)AfxMessageBox(Fail);/獲得DLL函數(shù)TESTDLL* lpproc;13.3動(dòng)態(tài)鏈接庫(kù)的使用動(dòng)態(tài)鏈接庫(kù)的使用36lpproc=(TESTDLL*)GetProcAdd
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度飼料原料電商平臺(tái)售后服務(wù)合同
- 二零二五年度物流運(yùn)輸勞務(wù)合同個(gè)稅起征點(diǎn)調(diào)整協(xié)議
- 2025年度石油化工工程安全監(jiān)管及環(huán)保評(píng)估合同
- 藝人演藝經(jīng)紀(jì)與經(jīng)紀(jì)公司簽約合同2025年度
- 二零二五年度化肥產(chǎn)品電商平臺(tái)合作合同
- 2025年度電商件代發(fā)與智能倉(cāng)儲(chǔ)設(shè)備租賃合同
- 家庭保姆合同(2025年度)專業(yè)家庭保姆服務(wù)及家庭文化傳承協(xié)議
- 2025年勞保鞋購(gòu)買(mǎi)合同模板
- 2025年住房維修維護(hù)合同
- 2025年分期付款貸款合同示范文本
- 產(chǎn)品設(shè)計(jì)思維 課件 第1章 產(chǎn)品設(shè)計(jì)思維概述
- 雙重血漿置換
- 兒童和青少年高尿酸血癥的預(yù)防和管理
- 產(chǎn)品質(zhì)量檢驗(yàn)確認(rèn)單
- 數(shù)控機(jī)床故障診斷與維護(hù)實(shí)驗(yàn)指導(dǎo)書(shū)-實(shí)驗(yàn)報(bào)告
- 酒店服務(wù)禮儀(中職酒店服務(wù)與管理專業(yè))PPT完整全套教學(xué)課件
- 燃燒器更換施工方案
- 體育旅游課件第二章體育旅游資源
- 節(jié)能降耗培訓(xùn)
- T-CHAS 20-2-11-2022 醫(yī)療機(jī)構(gòu)藥事管理與藥學(xué)服務(wù) 第2-11部分:臨床藥學(xué)服務(wù) 治療藥物監(jiān)測(cè)
- 質(zhì)量部架構(gòu)圖
評(píng)論
0/150
提交評(píng)論