(動(dòng)態(tài)鏈接庫)DLL編寫與使用方法

(動(dòng)態(tài)鏈接庫)DLL編寫與使用方法

ID:40486268

大?。?7.00 KB

頁數(shù):6頁

時(shí)間:2019-08-03

(動(dòng)態(tài)鏈接庫)DLL編寫與使用方法_第1頁
(動(dòng)態(tài)鏈接庫)DLL編寫與使用方法_第2頁
(動(dòng)態(tài)鏈接庫)DLL編寫與使用方法_第3頁
(動(dòng)態(tài)鏈接庫)DLL編寫與使用方法_第4頁
(動(dòng)態(tài)鏈接庫)DLL編寫與使用方法_第5頁
資源描述:

《(動(dòng)態(tài)鏈接庫)DLL編寫與使用方法》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫

1、DLL的創(chuàng)建與調(diào)用1、DLL的概念DLL(DynamicLinkableLibrary),動(dòng)態(tài)鏈接庫,可以向程序提供一些函數(shù)、變量或類。這些可以直接拿來使用。靜態(tài)鏈接庫與動(dòng)態(tài)鏈接庫的區(qū)別:(1)靜態(tài)鏈接庫與動(dòng)態(tài)鏈接庫都是共享代碼的方式。靜態(tài)鏈接庫把最后的指令都包含在最終生成的EXE文件中了;動(dòng)態(tài)鏈接庫不必被包含在最終EXE文件中,EXE文件執(zhí)行時(shí)可以“動(dòng)態(tài)”地引用和卸載這個(gè)與EXE獨(dú)立的DLL文件。(2)靜態(tài)鏈接庫中不能再包含其他的動(dòng)態(tài)鏈接庫或者靜態(tài)庫,而在動(dòng)態(tài)鏈接庫中還可以再包含其他的動(dòng)態(tài)或靜態(tài)鏈接庫。動(dòng)態(tài)鏈接庫的分類:VisualC++支持三種DLL,它們分別是Non-MFCD

2、LL(非MFC動(dòng)態(tài)庫)、MFCRegularDLL(MFC規(guī)則DLL)、MFCExtensionDLL(MFC擴(kuò)展DLL)。非MFC動(dòng)態(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)用。2、創(chuàng)建一個(gè)DLL2.1非MFC的DLL2.1.1聲明導(dǎo)出函數(shù):extern“C”__declspec(dllexport)intadd(inta,intb);其中extern“C”為聲明為C編譯。由于C

3、++編譯器在編譯的時(shí)候會(huì)造成其函數(shù)名的該變,在其他應(yīng)用程序中導(dǎo)致函數(shù)不可調(diào)用,而C編譯器則不會(huì)在編譯后改變其函數(shù)名。這樣如果用C編譯的程序來調(diào)用該dll中的函數(shù)時(shí),可能會(huì)造成找不到該函數(shù)。__declspec(dllexport)表示該函數(shù)為DLL輸出函數(shù),即其他應(yīng)用程序可以調(diào)用該函數(shù)從dll中聲明輸出函數(shù)有兩種方式:(1)另外一種方式是采用模塊定義(.def)文件聲明,.def文件為鏈接器提供了有關(guān)被鏈接程序的導(dǎo)出、屬性及其他方面的信息。(2)用__declspec(dllexport)來聲明函數(shù)如果使用VisualC++來創(chuàng)建dll,對(duì)于同樣用VC創(chuàng)建的exe來說,調(diào)用dll沒

4、有什么問題。而如果用其他工具來創(chuàng)建的exe來調(diào)用dll,就會(huì)出現(xiàn)問題。因?yàn)榧词鼓悴挥肅++編譯器,MicrosoftC編譯器也會(huì)損害C函數(shù)。當(dāng)用__stdcall將函數(shù)輸出時(shí),C編譯器會(huì)將函數(shù)改為_func@1的形式。在這里需要在.def文件中加入EXPORTS節(jié)來輸出函數(shù):EXPORTSfunc這樣,dll將用func函數(shù)名來輸出函數(shù)。另一種方式是用#pragma(linker,“/exports:func=_func@1”),告訴編譯器輸出函數(shù)func,這種方式?jīng)]有前一種好。如果通過VC++編寫的DLL欲被其他語言編寫的程序調(diào)用,應(yīng)將函數(shù)的調(diào)用方式聲明為__stdcall方式,

5、WINAPI都采用這種方式,而C/C++缺省的調(diào)用方式卻為__cdecl。__stdcall方式與__cdecl對(duì)函數(shù)名最終生成符號(hào)的方式不同。若采用C編譯方式(在C++中需將函數(shù)聲明為extern"C"),__stdcall調(diào)用約定在輸出函數(shù)名前面加下劃線,后面加“@”符號(hào)和參數(shù)的字節(jié)數(shù),形如_functionname@number;而__cdecl調(diào)用約定僅在輸出函數(shù)名前面加下劃線,形如_functionname。;lib.def:導(dǎo)出DLL函數(shù)LIBRARYdllTestEXPORTSadd@1.def文件的規(guī)則為:  (1)LIBRARY語句說明.def文件相應(yīng)的DLL; 

6、 (2)EXPORTS語句后列出要導(dǎo)出函數(shù)的名稱。可以在.def文件中的導(dǎo)出函數(shù)名后加@n,表示要導(dǎo)出函數(shù)的序號(hào)為n(在進(jìn)行函數(shù)調(diào)用時(shí),這個(gè)序號(hào)將發(fā)揮其作用);  (3).def文件中的注釋由每個(gè)注釋行開始處的分號(hào)(;)指定,且注釋不能與語句共享一行?! ∮纱丝梢钥闯?,例子中l(wèi)ib.def文件的含義為生成名為“dllTest”的動(dòng)態(tài)鏈接庫,導(dǎo)出其中的add函數(shù),并指定add函數(shù)的序號(hào)為1。2.1.2Dll的調(diào)用方式:DLL的調(diào)用分為兩種方式:動(dòng)態(tài)和靜態(tài)(1)動(dòng)態(tài)調(diào)用:typedefint(*lpAddFun)(int,int);//宏定義函數(shù)指針類型lpAddFunadd;//函數(shù)

7、指針HINSTANCEhDll=LoadLibrary(“path”);add=(lpAddFun)GetProcAddress(hDll,"add");//獲得dll中的add函數(shù)指針FreeLibrary(hDll);在從dll調(diào)用中返回的函數(shù)、指針或者類都是以指針的方式會(huì)的,即返回的是函數(shù)、變量或類的地址。這里一定要注意,不能簡單的用函數(shù)名來賦值。(2)靜態(tài)調(diào)用:將生成的.dll和.lib文件拷入到調(diào)用dll的工程中,用命令#pragmacomment(lib,

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無此問題,請(qǐng)放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對(duì)本文檔版權(quán)有爭議請(qǐng)及時(shí)聯(lián)系客服。
3. 下載前請(qǐng)仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶請(qǐng)聯(lián)系客服處理。