溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

VC中DLL的創(chuàng)建及調(diào)用方法分享

發(fā)布時(shí)間:2021-08-05 21:27:15 來(lái)源:億速云 閱讀:301 作者:chen 欄目:編程語(yǔ)言

這篇文章主要講解了“VC中DLL的創(chuàng)建及調(diào)用方法分享”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“VC中DLL的創(chuàng)建及調(diào)用方法分享”吧!

方法一:

VC中DLL的創(chuàng)建及調(diào)用方法  

此中只有實(shí)際才操作,而無(wú)相關(guān)理論  

²             DLL的創(chuàng)建  

首先,用VC集成開(kāi)發(fā)界面中的“新建”,新建一個(gè)項(xiàng)目。無(wú)論是VC6.0還是VC.NET,都有建立DLL項(xiàng)目的選項(xiàng)。只不過(guò)有些稍有不同,例如VC.NET中就有ISAPI   DLL,擴(kuò)展存儲(chǔ)過(guò)程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)程過(guò)程指針,通過(guò)GetProcAddress獲得函數(shù)的地址。它的兩個(gè)參數(shù)就是dll文件句柄和函數(shù)的名字了。  

然后FARPROC就可以和go一樣的使用了,它就是go   ,go   就是它。  

而對(duì)于帶參數(shù)的DLL中的函數(shù),調(diào)用方法有所不同。因?yàn)閷?duì)函數(shù)的調(diào)用是通過(guò)對(duì)它地址的引用進(jìn)行的,這樣,傳入?yún)?shù)對(duì)不對(duì),在函數(shù)調(diào)用程序的編譯和聯(lián)接過(guò)程中,無(wú)法知道其正確性。因此,要在調(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è)了(略)。

感謝各位的閱讀,以上就是“VC中DLL的創(chuàng)建及調(diào)用方法分享”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)VC中DLL的創(chuàng)建及調(diào)用方法分享這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

vc
AI