VC6.0如何創(chuàng)建以及調(diào)用動(dòng)態(tài)鏈接庫(kù)實(shí)例詳解
更新時(shí)間:2013年01月03日 14:34:20 作者:
作為客戶(hù)與后臺(tái)的中介,為了更好的調(diào)節(jié)兩方的關(guān)系,我明智滴選擇了webservice以及動(dòng)態(tài)鏈接庫(kù)。在與客戶(hù)c++使動(dòng)態(tài)鏈接庫(kù)方式,而與后臺(tái)java,使用webservice來(lái)交流溝通
小弟在公司的職責(zé),在上篇博客中已經(jīng)簡(jiǎn)約介紹。這邊博客主要介紹技術(shù)的應(yīng)用而不在細(xì)究原理。因?yàn)楣卷?xiàng)目著急,出結(jié)果要緊,并且咱也不是專(zhuān)注搞研究的,所以,基本懂了原理后,直接上手工作,搞出demo來(lái)最好。
至于公司工作情況,今天暫且略過(guò),當(dāng)然也不是一兩句能夠表達(dá)清楚的。后面會(huì)有相應(yīng)的工作總結(jié),敬請(qǐng)期待……
現(xiàn)在,廢話(huà)少說(shuō),直奔主題——VC6.0中創(chuàng)建動(dòng)態(tài)鏈接庫(kù)。
作為客戶(hù)與后臺(tái)的中介,為了更好的調(diào)節(jié)兩方的關(guān)系,我明智滴選擇了webservice以及動(dòng)態(tài)鏈接庫(kù)。在與客戶(hù)c++使動(dòng)態(tài)鏈接庫(kù)方式,而與后臺(tái)java,使用webservice來(lái)交流溝通。
既然有了動(dòng)態(tài)鏈接庫(kù),肯定大家會(huì)想到靜態(tài)鏈接庫(kù)。呵呵,這個(gè)是相對(duì)的。那這兩者有什么區(qū)別呢?那又為什么選擇了動(dòng)態(tài)鏈接庫(kù)呢?
靜態(tài)鏈接庫(kù):是把lib文件也打包到了exe文件中。
動(dòng)態(tài)鏈接庫(kù):沒(méi)有把lib文件打包到exe文件中,若是使用,則直接加載卸載相應(yīng)的dll文件。
并且,靜態(tài)鏈接庫(kù)中不允許包含靜態(tài)鏈接庫(kù)和動(dòng)態(tài)鏈接庫(kù),而動(dòng)態(tài)鏈接庫(kù)中是允許包含靜態(tài)鏈接庫(kù)和動(dòng)態(tài)鏈接庫(kù)的。因?yàn)樾〉芊庋b的dll中是調(diào)用客戶(hù)的dll,并且有可能包含另外自己的動(dòng)態(tài)鏈接庫(kù)。
鑒于此,小弟選擇了動(dòng)態(tài)鏈接庫(kù)。
還有一點(diǎn)是,動(dòng)態(tài)鏈接庫(kù),也是分為三種情況的。一是非MFC的dll(也就是控制臺(tái)的dll),二是常規(guī)的MFC的dll(其中又分靜態(tài)的dl和共享的dll),三是擴(kuò)展的MFC 的dll。并且MFC的dll可以被MFC程序或者控制臺(tái)程序調(diào)用。
因?yàn)樾〉芊庋b的dll,需要供MFC程序調(diào)用,所以選擇使用了MFC常規(guī)的dll。并且使用控制臺(tái)程序做測(cè)試。
首先,在新建工程中選擇MFC AppWizard (dll)
然后在頭.h文件中,聲明被外界調(diào)用的函數(shù)
extern "C" _declspec(dllexport) char* queryFunctionByFID(char* funcId);
聲明后,在cpp文件中,實(shí)現(xiàn)此函數(shù)。
char* queryFunctionByFID(char* funcId)
{
…………………………
具體的操作實(shí)現(xiàn)}
編譯,build生成。OK,在Debug下生成相應(yīng)的dll,至此動(dòng)態(tài)鏈接庫(kù)生成了。然后程序就可以直接使用此dll文件了。
然后呢。把dll文件copy到相應(yīng)的測(cè)試dll程序(調(diào)用dll的程序)下。使用方式如下:
我測(cè)試dll程序中,是使用的控制臺(tái)程序,這樣簡(jiǎn)單方便,當(dāng)然使用MFC程序也可以。
比如:我們新建一個(gè)控制臺(tái)程序,然后在main方法中,寫(xiě)如下:
//聲明函數(shù)指針 寫(xiě)明函數(shù)參數(shù)個(gè)數(shù),參數(shù)類(lèi)型以及返回值類(lèi)型
typedef char* (* queryFunctionByFID)(char*);
//加載動(dòng)態(tài)鏈接庫(kù),返回DLL文件的句柄
HINSTANCE hDLL=NULL;
//加載動(dòng)態(tài)鏈接庫(kù),dll名稱(chēng)要與剛才生成的dll名稱(chēng)保持一致。
hDLL=LoadLibrary("IProcessInstIn.dll");
queryFunctionByFID saveProcess=NULL;
//加載動(dòng)態(tài)鏈接庫(kù)中相應(yīng)的函數(shù)
saveProcess=(queryFunctionByFID)GetProcAddress(hDLL,"queryFunctionByFID");
//真正的調(diào)用相應(yīng)的函數(shù)
cout<<"結(jié)果是:"<<saveProcess("dd");
//調(diào)用完畢后釋放資源
FreeLibrary(hDLL);
每一句的作用,注釋已經(jīng)表達(dá)清楚。若是有不懂的,可以聯(lián)系我,互相交流一下。
其實(shí),動(dòng)態(tài)鏈接庫(kù),類(lèi)似我們VS中的dll,只不過(guò),當(dāng)時(shí)只要把dll引用到相應(yīng)的程序,然后直接可以使用。而在此,是我們手動(dòng)加載,連接,釋放dll。使用這種方式的動(dòng)態(tài)鏈接庫(kù),我們可以很隨意在我們程序中的任何地方都可以使用我們想調(diào)用的函數(shù)。
只要我們遵守了“加載,LoadLibrary——GetProcAddress——FreeLibrary”原則即可。使用相當(dāng)方便。即可解脫了兩者之間耦合的困擾,又可以加載釋放方便。
調(diào)用靜態(tài)鏈接庫(kù)的做法如下:
第一:把lib文件和dll文件兩個(gè)文件全部放在客戶(hù)端下,調(diào)用動(dòng)態(tài)鏈接庫(kù)時(shí),只需要dll文件。
第二:在客戶(hù)端中需要新建頭文件,類(lèi)似dll中的導(dǎo)出函數(shù)的頭文件。
第三:在客戶(hù)端調(diào)用dll文件中(cpp文件),添加預(yù)指令,也就是把lib文件顯式加載進(jìn)來(lái)。
如:#pragma comment (lib,"IProcessInstIn.dll")
第四:在button事件下,直接調(diào)用相應(yīng)的方法。
如:cout<<"結(jié)果是:"<<queryFunctionByFID(相應(yīng)的參數(shù));
總之,調(diào)用靜態(tài)鏈接庫(kù),相對(duì)于來(lái)說(shuō),比較簡(jiǎn)單,只要把相應(yīng)的文件加載進(jìn)來(lái)后,直接調(diào)用方法即可。但是調(diào)用動(dòng)態(tài)鏈接庫(kù)相對(duì)來(lái)說(shuō),比較靈活,何時(shí)使用何時(shí)加載,不使用了直接卸載即可。
任何事物都有優(yōu)缺點(diǎn),我們呢,就是充分利用他們的優(yōu)點(diǎn),在不同的場(chǎng)合不同的需求下使用不同的方式。
剛才我們?cè)谏蒬ll時(shí),使用Debug版本下的dll,既然有可以選擇Debug版本,根據(jù)我們的思維,肯定會(huì)想到,存在另外的版本。下篇博客中,我們會(huì)介紹一下Debug版本下的動(dòng)態(tài)鏈接庫(kù)和另一個(gè)版本Release版本下的動(dòng)態(tài)鏈接庫(kù)的區(qū)別,以及何時(shí)何地選擇何種版本。
至于公司工作情況,今天暫且略過(guò),當(dāng)然也不是一兩句能夠表達(dá)清楚的。后面會(huì)有相應(yīng)的工作總結(jié),敬請(qǐng)期待……
現(xiàn)在,廢話(huà)少說(shuō),直奔主題——VC6.0中創(chuàng)建動(dòng)態(tài)鏈接庫(kù)。
作為客戶(hù)與后臺(tái)的中介,為了更好的調(diào)節(jié)兩方的關(guān)系,我明智滴選擇了webservice以及動(dòng)態(tài)鏈接庫(kù)。在與客戶(hù)c++使動(dòng)態(tài)鏈接庫(kù)方式,而與后臺(tái)java,使用webservice來(lái)交流溝通。
既然有了動(dòng)態(tài)鏈接庫(kù),肯定大家會(huì)想到靜態(tài)鏈接庫(kù)。呵呵,這個(gè)是相對(duì)的。那這兩者有什么區(qū)別呢?那又為什么選擇了動(dòng)態(tài)鏈接庫(kù)呢?
靜態(tài)鏈接庫(kù):是把lib文件也打包到了exe文件中。
動(dòng)態(tài)鏈接庫(kù):沒(méi)有把lib文件打包到exe文件中,若是使用,則直接加載卸載相應(yīng)的dll文件。
并且,靜態(tài)鏈接庫(kù)中不允許包含靜態(tài)鏈接庫(kù)和動(dòng)態(tài)鏈接庫(kù),而動(dòng)態(tài)鏈接庫(kù)中是允許包含靜態(tài)鏈接庫(kù)和動(dòng)態(tài)鏈接庫(kù)的。因?yàn)樾〉芊庋b的dll中是調(diào)用客戶(hù)的dll,并且有可能包含另外自己的動(dòng)態(tài)鏈接庫(kù)。
鑒于此,小弟選擇了動(dòng)態(tài)鏈接庫(kù)。
還有一點(diǎn)是,動(dòng)態(tài)鏈接庫(kù),也是分為三種情況的。一是非MFC的dll(也就是控制臺(tái)的dll),二是常規(guī)的MFC的dll(其中又分靜態(tài)的dl和共享的dll),三是擴(kuò)展的MFC 的dll。并且MFC的dll可以被MFC程序或者控制臺(tái)程序調(diào)用。
因?yàn)樾〉芊庋b的dll,需要供MFC程序調(diào)用,所以選擇使用了MFC常規(guī)的dll。并且使用控制臺(tái)程序做測(cè)試。
首先,在新建工程中選擇MFC AppWizard (dll)
然后在頭.h文件中,聲明被外界調(diào)用的函數(shù)
復(fù)制代碼 代碼如下:
extern "C" _declspec(dllexport) char* queryFunctionByFID(char* funcId);
聲明后,在cpp文件中,實(shí)現(xiàn)此函數(shù)。
復(fù)制代碼 代碼如下:
char* queryFunctionByFID(char* funcId)
{
…………………………
具體的操作實(shí)現(xiàn)}
編譯,build生成。OK,在Debug下生成相應(yīng)的dll,至此動(dòng)態(tài)鏈接庫(kù)生成了。然后程序就可以直接使用此dll文件了。
然后呢。把dll文件copy到相應(yīng)的測(cè)試dll程序(調(diào)用dll的程序)下。使用方式如下:
我測(cè)試dll程序中,是使用的控制臺(tái)程序,這樣簡(jiǎn)單方便,當(dāng)然使用MFC程序也可以。
比如:我們新建一個(gè)控制臺(tái)程序,然后在main方法中,寫(xiě)如下:
復(fù)制代碼 代碼如下:
//聲明函數(shù)指針 寫(xiě)明函數(shù)參數(shù)個(gè)數(shù),參數(shù)類(lèi)型以及返回值類(lèi)型
typedef char* (* queryFunctionByFID)(char*);
//加載動(dòng)態(tài)鏈接庫(kù),返回DLL文件的句柄
HINSTANCE hDLL=NULL;
//加載動(dòng)態(tài)鏈接庫(kù),dll名稱(chēng)要與剛才生成的dll名稱(chēng)保持一致。
hDLL=LoadLibrary("IProcessInstIn.dll");
queryFunctionByFID saveProcess=NULL;
//加載動(dòng)態(tài)鏈接庫(kù)中相應(yīng)的函數(shù)
saveProcess=(queryFunctionByFID)GetProcAddress(hDLL,"queryFunctionByFID");
//真正的調(diào)用相應(yīng)的函數(shù)
cout<<"結(jié)果是:"<<saveProcess("dd");
//調(diào)用完畢后釋放資源
FreeLibrary(hDLL);
每一句的作用,注釋已經(jīng)表達(dá)清楚。若是有不懂的,可以聯(lián)系我,互相交流一下。
其實(shí),動(dòng)態(tài)鏈接庫(kù),類(lèi)似我們VS中的dll,只不過(guò),當(dāng)時(shí)只要把dll引用到相應(yīng)的程序,然后直接可以使用。而在此,是我們手動(dòng)加載,連接,釋放dll。使用這種方式的動(dòng)態(tài)鏈接庫(kù),我們可以很隨意在我們程序中的任何地方都可以使用我們想調(diào)用的函數(shù)。
只要我們遵守了“加載,LoadLibrary——GetProcAddress——FreeLibrary”原則即可。使用相當(dāng)方便。即可解脫了兩者之間耦合的困擾,又可以加載釋放方便。
調(diào)用靜態(tài)鏈接庫(kù)的做法如下:
第一:把lib文件和dll文件兩個(gè)文件全部放在客戶(hù)端下,調(diào)用動(dòng)態(tài)鏈接庫(kù)時(shí),只需要dll文件。
第二:在客戶(hù)端中需要新建頭文件,類(lèi)似dll中的導(dǎo)出函數(shù)的頭文件。
第三:在客戶(hù)端調(diào)用dll文件中(cpp文件),添加預(yù)指令,也就是把lib文件顯式加載進(jìn)來(lái)。
如:#pragma comment (lib,"IProcessInstIn.dll")
第四:在button事件下,直接調(diào)用相應(yīng)的方法。
如:cout<<"結(jié)果是:"<<queryFunctionByFID(相應(yīng)的參數(shù));
總之,調(diào)用靜態(tài)鏈接庫(kù),相對(duì)于來(lái)說(shuō),比較簡(jiǎn)單,只要把相應(yīng)的文件加載進(jìn)來(lái)后,直接調(diào)用方法即可。但是調(diào)用動(dòng)態(tài)鏈接庫(kù)相對(duì)來(lái)說(shuō),比較靈活,何時(shí)使用何時(shí)加載,不使用了直接卸載即可。
任何事物都有優(yōu)缺點(diǎn),我們呢,就是充分利用他們的優(yōu)點(diǎn),在不同的場(chǎng)合不同的需求下使用不同的方式。
剛才我們?cè)谏蒬ll時(shí),使用Debug版本下的dll,既然有可以選擇Debug版本,根據(jù)我們的思維,肯定會(huì)想到,存在另外的版本。下篇博客中,我們會(huì)介紹一下Debug版本下的動(dòng)態(tài)鏈接庫(kù)和另一個(gè)版本Release版本下的動(dòng)態(tài)鏈接庫(kù)的區(qū)別,以及何時(shí)何地選擇何種版本。
您可能感興趣的文章:
- 在Visual Studio上構(gòu)建C++的GUI框架wxWidgets的開(kāi)發(fā)環(huán)境
- 在Visual Studio使用C++開(kāi)發(fā)Metro應(yīng)用
- 在Visual Studio中用C++語(yǔ)言創(chuàng)建DLL動(dòng)態(tài)鏈接庫(kù)圖文教程
- Microsoft Visual C++ 程序的部署方法
- VC6.0代碼自動(dòng)提示 VC6.0在win7環(huán)境下代碼提示智能化
- VC6.0打開(kāi)文件以及向工程中添加文件時(shí)程序崩潰自動(dòng)退出解決方法
- Microsoft Visual C++ 6.0開(kāi)發(fā)環(huán)境搭建教程
相關(guān)文章
C語(yǔ)言編程中的聯(lián)合體union入門(mén)學(xué)習(xí)教程
這篇文章主要介紹了C語(yǔ)言編程中的聯(lián)合體union入門(mén)學(xué)習(xí)教程,也是C語(yǔ)言入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-12-12
C語(yǔ)言實(shí)現(xiàn)計(jì)算圓周長(zhǎng)以及面積
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)計(jì)算圓周長(zhǎng)以及面積方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
詳細(xì)分析C++ 數(shù)據(jù)封裝和數(shù)據(jù)抽象
這篇文章主要介紹了C++ 數(shù)據(jù)封裝和數(shù)據(jù)抽象的的相關(guān)資料,文中代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-06-06
C++實(shí)現(xiàn)學(xué)生檔案管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)學(xué)生檔案管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
C字符串操作函數(shù)的實(shí)現(xiàn)詳細(xì)解析
以下是對(duì)C語(yǔ)言中字符串操作函數(shù)的實(shí)現(xiàn)進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下2013-08-08
c語(yǔ)言使用fdk_aac實(shí)現(xiàn)aac音頻解碼為pcm
這篇文章主要為大家詳細(xì)介紹了c語(yǔ)言如何使用fdk_aac庫(kù)實(shí)現(xiàn)aac音頻解碼為pcm的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-11-11
Qt實(shí)現(xiàn)定時(shí)器的兩種方法分享
這篇文章主要為大家詳細(xì)介紹了Qt中實(shí)現(xiàn)定時(shí)器的兩種不同方法,文中的示例代碼講解詳細(xì),對(duì)我們了解Qt有一定的幫助,感興趣的可以跟隨小編一起學(xué)習(xí)一下2022-11-11
GCC編譯過(guò)程(預(yù)處理,編譯,匯編,鏈接)及GCC命令詳解
文章詳細(xì)介紹了GCC編譯器的工作原理,包括預(yù)處理、編譯、匯編和鏈接四個(gè)主要階段,每個(gè)階段都有其特定的任務(wù)和輸出文件,文章還解釋了如何使用GCC命令選項(xiàng)來(lái)查看每個(gè)階段的輸出,以及如何通過(guò)調(diào)整編譯選項(xiàng)來(lái)優(yōu)化程序性能或調(diào)試問(wèn)題,感興趣的朋友跟隨小編一起看看吧2024-11-11

