VC中DLL的創(chuàng)建及調(diào)用方法介紹
方法一:
VC中DLL的創(chuàng)建及調(diào)用方法
此中只有實(shí)際才操作,而無相關(guān)理論
² DLL的創(chuàng)建
首先,用VC集成開發(fā)界面中的“新建”,新建一個(gè)項(xiàng)目。無論是VC6.0還是VC.NET,都有建立DLL項(xiàng)目的選項(xiàng)。只不過有些稍有不同,例如VC.NET中就有ISAPI DLL,擴(kuò)展存儲(chǔ)過程DLL等,這些都不在討論的范圍。例如我們建立了一個(gè)用靜態(tài)連接MFC庫(kù)的DLL項(xiàng)目,名稱為mydll
然后,編輯mydll.cpp文件,在其中加入我們自己的函數(shù)void go()。注意,不需要在mydll.h中聲明它,而需要將函數(shù)頭變成如下樣子:
- extern “c” __declspec(dllexport) void go()
- {
- //code……
- }
dllexport表示這個(gè)函數(shù)是由外部調(diào)用的。
由于是否帶參數(shù),要影響到外部調(diào)用的方式,因此,我們?cè)俾暶饕粋€(gè)帶參數(shù)的函數(shù):
- extern “c” __declspec(dllexport) void went(CString str)
- {
- //code……
- }
OK,下面編譯連接形成mydll.dll文件。
² DLL的調(diào)用
好,下面我們就用VC寫個(gè)程序調(diào)用它。在調(diào)用的函數(shù)中,首先要獲得DLL的句柄,有如下語(yǔ)句:
- HINSTANCE dllinstance;
- dllinstance=::LoadLibrary(strDllUrl);
- if(dllinstance==NULL) AfxMessageBox("can't open dll file");
其中strDllUrl是mydll.dll路徑的字符串,這樣程序才能找到它。::LoadLibrary獲得參數(shù)標(biāo)識(shí)的DLL文件的句柄。
獲得句柄后,下面要獲得函數(shù)地址以便執(zhí)行它。有如下語(yǔ)句:
- FARPROC proc;
- proc=GetProcAddress(dllinstance,"go");
- if(proc==NULL) AfxMessageBox("can't find function");
- else proc();
FARPROC是一個(gè)遠(yuǎn)程過程指針,通過GetProcAddress獲得函數(shù)的地址。它的兩個(gè)參數(shù)就是dll文件句柄和函數(shù)的名字了。
然后FARPROC就可以和go一樣的使用了,它就是go ,go 就是它。
而對(duì)于帶參數(shù)的DLL中的函數(shù),調(diào)用方法有所不同。因?yàn)閷?duì)函數(shù)的調(diào)用是通過對(duì)它地址的引用進(jìn)行的,這樣,傳入?yún)?shù)對(duì)不對(duì),在函數(shù)調(diào)用程序的編譯和聯(lián)接過程中,無法知道其正確性。因此,要在調(diào)用程序中對(duì)DLL中帶參數(shù)的函數(shù)做個(gè)聲明,如mydll中的went,我們要做個(gè)聲明如下:
- typedef void (FAR __cdecl *MYWENT)(CString);
然后以類型MYWENT聲明變量既可調(diào)用,如下:
- MYWENT myproc;
- myproc =(MYWENT)GetProcAddress(dllinstance,"go");
- if(myproc ==NULL) AfxMessageBox("can't find function");
- else myproc (“o-----yeah---------”);
注意聲明的時(shí)候呢,由于DLL中WENT的定義為C語(yǔ)言調(diào)用規(guī)范,因此MYWENT前一定要用__cdecl,而VC中常用的__stdcall是PASCAL調(diào)用規(guī)范,不可以的。一定要注意。
方法二:
VC中DLL的創(chuàng)建及調(diào)用方法
New->MfcWiazard.dll 一路下去,就會(huì)生成一個(gè)了(略)。
【編輯推薦】