資源描述:
《動態(tài)鏈接庫(dll)編程.ppt》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、VC++動態(tài)鏈接庫(DLL)編程1.概論先來闡述一下DLL(DynamicLinkableLibrary)的概念,你可以簡單的把DLL看成一種倉庫,它提供給你一些可以直接拿來用的變量、函數(shù)或類。在倉庫的發(fā)展史上經(jīng)歷了“無庫-靜態(tài)鏈接庫-動態(tài)鏈接庫”的時代。對動態(tài)鏈接庫,需建立如下概念:(1)與具體的編程語言及編譯器無關(guān)只要遵循約定的DLL接口規(guī)范和調(diào)用方式,用各種語言編寫的DLL都可以相互調(diào)用。譬如Windows提供的系統(tǒng)DLL(其中包括了Windows的API),在任何開發(fā)環(huán)境中都能被調(diào)用,不在乎其
2、是VisualBasic、VisualC++還是Delphi。(2)動態(tài)鏈接庫隨處可見在Windows目錄下的system32文件夾中會看到kernel32.dll、user32.dll和gdi32.dll,windows的大多數(shù)API都包含在這些DLL中。kernel32.dll中的函數(shù)主要處理內(nèi)存管理和進程調(diào)度;user32.dll中的函數(shù)主要控制用戶界面(MessageBox函數(shù));gdi32.dll中的函數(shù)則負責(zé)圖形方面的操作。(3)VC動態(tài)鏈接庫的分類VisualC++支持三種DLL,它們分
3、別是非MFC動態(tài)庫、MFC規(guī)則DLL、MFCExtensionDLL。非MFC動態(tài)庫不采用MFC類庫結(jié)構(gòu),其導(dǎo)出函數(shù)為標(biāo)準的C接口,能被非MFC或MFC編寫的應(yīng)用程序所調(diào)用;MFC規(guī)則DLL包含一個繼承自CWinApp的類,但其無消息循環(huán);MFC擴展DLL采用MFC的動態(tài)鏈接版本創(chuàng)建,它只能被用MFC類庫所編寫的應(yīng)用程序所調(diào)用。2.靜態(tài)鏈接庫在VC++6.0中new一個名稱為libTest的staticlibrary工程,并新建lib.h和lib.cpp兩個文件,lib.h和lib.cpp的源代碼如下
4、://文件:lib.h#ifndefLIB_H#defineLIB_Hextern"C"intadd(intx,inty);//聲明為C編譯、連接方式的外部函數(shù)#endif//文件:lib.cpp#include"lib.h"intadd(intx,inty){returnx+y;}#include#include"..lib.h"#pragmacomment(lib,"..\debug\libTest.lib")//指定與靜態(tài)庫一起連接intmain(intargc,char
5、*argv[])?{printf("2+3=%d",add(2,3));}選擇tools、options、directories、libraryfiles菜單或選項,填入庫文件路徑4.非MFCDLL在建立的工程中添加lib.h及l(fā)ib.cpp文件,源代碼如下:/*文件名:lib.h*/#ifndefLIB_H#defineLIB_Hextern"C"int__declspec(dllexport)add(intx,inty);#endif/*文件名:lib.cpp*/#include"lib.
6、h"intadd(intx,inty){returnx+y;}dllCall#include#includetypedefint(*lpAddFun)(int,int);//宏定義函數(shù)指針類型intmain(intargc,char*argv[]){HINSTANCEhDll;//DLL句柄lpAddFunaddFun;//函數(shù)指針hDll=LoadLibrary("..\Debug\dllTest.dll");if(hDll!=NULL){
7、addFun=(lpAddFun)GetProcAddress(hDll,"add");if(addFun!=NULL){intresult=addFun(2,3);printf("%d",result);}FreeLibrary(hDll);}return0;}DLL的調(diào)用和靜態(tài)鏈接庫的調(diào)用有較大差異首先,語句typedefint(*lpAddFun)(int,int)定義了一個與add函數(shù)接受參數(shù)類型和返回值均相同的函數(shù)指針類型。隨后,在main函數(shù)中定義了lpAddFun的實例add
8、Fun;其次,在函數(shù)main中定義了一個DLLHINSTANCE句柄實例hDll,通過Win32Api函數(shù)LoadLibrary動態(tài)加載了DLL模塊并將DLL模塊句柄賦給了hDll;再次,在函數(shù)main中通過Win32Api函數(shù)GetProcAddress得到了所加載DLL模塊中函數(shù)add的地址并賦給了addFun。經(jīng)由函數(shù)指針addFun進行了對DLL中add函數(shù)的調(diào)用;最后,應(yīng)用工程使用完DLL后,在函數(shù)main中通過Win32Api函數(shù)