日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

将自己的类封装为lib的方法

發(fā)布時間:2023/12/31 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 将自己的类封装为lib的方法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言:

Windows API中所有的函數(shù)都包含在dll中,其中有3個最重要的DLL。

(1)???Kernel32.dll 它包含那些用于管理內(nèi)存、進(jìn)程和線程的函數(shù),例如CreateThread函數(shù);

(2)???User32.dll ? 它包含那些用于執(zhí)行用戶界面任務(wù)(如窗口的創(chuàng)建和消息的傳送)的函數(shù),例如CreateWindow函數(shù);

(3)???GDI32.dll ?? 它包含那些用于畫圖和顯示文本的函數(shù)。

靜態(tài)庫和動態(tài)庫

(1)???靜態(tài)庫

?????????函數(shù)和數(shù)據(jù)被編譯進(jìn)一個二進(jìn)制文件(通常擴(kuò)展名為.LIB)。在使用靜態(tài)庫的情況下,在編譯鏈接可執(zhí)行文件時,鏈接器從庫中復(fù)制這些函數(shù)和數(shù)據(jù)并把它們和應(yīng)用程序的其他模塊組合起來創(chuàng)建最終的可執(zhí)行文件(.Exe文件).當(dāng)發(fā)布產(chǎn)品時,只需要發(fā)布這個可執(zhí)行文件,并不需要發(fā)布被使用的靜態(tài)庫。

(2)???動態(tài)庫

??????在使用動態(tài)庫的時候,往往提供兩個文件:一個引入庫(.lib)文件和一個DLL(.dll)文件。雖然引入庫的后綴名也是”lib”,但是動態(tài)庫的引入庫文件和靜態(tài)庫文件有著本質(zhì)上的區(qū)別,對一個DLL來說,其引入庫文件(.lib)包含該DLL導(dǎo)出的函數(shù)和變量的符號名,而.dll文件包含該DLL實際的函數(shù)和數(shù)據(jù)。在使用動態(tài)庫的情況下,在編譯鏈接可執(zhí)行文件時,只需要鏈接該DLL的引入庫文件,該DLL中的函數(shù)代碼和數(shù)據(jù)并不復(fù)制到可執(zhí)行文件中,直到可執(zhí)行程序運(yùn)行時,才去加載所需的DLL,將該DLL映射到進(jìn)程的地址空間外,然后訪問DLL中導(dǎo)出的函數(shù)。這時,發(fā)布產(chǎn)品時,除了發(fā)布可執(zhí)行文件以外,同時還要發(fā)布該程序?qū)⒁{(diào)用的動態(tài)鏈接庫。

一、DLL的創(chuàng)建?

(1):方法引自于此文: http://blog.csdn.net/wqvbjhc/article/details/6029168?

????????????? 對于圖像缺失問題,請訪問原文鏈接.

(2):創(chuàng)建DLL 此文解釋已經(jīng)相當(dāng)詳細(xì),地址:http://hi.baidu.com/lipeiyi2006/item/df1d035734472d9509be17c0

? 不過為了防止以后博主刪除,還是copy一遍....、


創(chuàng)建項目:?Win32->Win32項目,名稱:MyDLL
選擇DLL?( D)?->完成.

1、新建頭文件testdll.h
testdll.h代碼如下:

#ifndef TestDll_H_ #define TestDll_H_ #ifdef MYLIBDLL#define MYLIBDLL extern "C" _declspec(dllimport) #else #define MYLIBDLL extern "C" _declspec(dllexport) #endif MYLIBDLL int Add(int plus1, int plus2); //You can also write like this: //extern "C" { //_declspec(dllexport) int Add(int plus1, int plus2); //}; #endif

Ps:__declspec(dllexport)的作用,它就是為了省掉在DEF文件中手工定義導(dǎo)出哪些函數(shù)的一個方法。當(dāng)然,如果你的DLL里全是C++的類的話,你無法在DEF里指定導(dǎo)出的函數(shù),只能用__declspec(dllexport)導(dǎo)出類。

*注:extern?"C"是可選的,extern?"C"是為了保證導(dǎo)出的DLL函數(shù)名不發(fā)生變化。如果寫了extern?"C",那么導(dǎo)出和導(dǎo)入都要寫,要保證一致。

?????????如果要導(dǎo)出的是類,不能在類名前加extern?"C",切記切記!!編譯不會通過的。

如果在新建dll的時候選擇空白的文件(即不用vs自帶的幫你生成)的話,注意一定要自己手動添加def文件。否則生成不了lib文件。


2、新建源文件testdll.cpp

#include "stdafx.h" #include "testdll.h" #include <iostream>using namespace std;int Add(int plus1, int plus2) { int add_result = plus1 + plus2; return add_result; }


3、新建模塊定義文件mydll.def
mydll.def代碼如下:
LIBRARY "MyDLL"EXPORTSAdd @1

PS:這個在VS2012中可能沒有,所以要這樣操作:

方法是:在所建工程上單擊鼠標(biāo)右鍵,在彈出的右鍵菜單中選擇添加-->新建項....---->模塊定義文件,在該模塊定義文件中寫導(dǎo)出函數(shù)表,單擊確定

Vs2012默認(rèn)生成dll,但不生成Lib文件。這個.def文件可以生成lib文件。


4、vs2010自動創(chuàng)建dllmain.cpp文件,它定義了DLL?應(yīng)用程序的入口點。

dllmain.cpp代碼如下:
//?dllmain.cpp?:?定義?DLL?應(yīng)用程序的入口點。

#include "stdafx.h" BOOL APIENTRY DllMain( HMODULE hModule,DWORD ul_reason_for_call,LPVOID lpReserved){ switch (ul_reason_for_call){ case DLL_PROCESS_ATTACH:case DLL_THREAD_ATTACH:case DLL_THREAD_DETACH:case DLL_PROCESS_DETACH:break; } return TRUE; }

最后,編譯生成MyDLL.dll文件和MyDLL.lib文件。

1>------ 已啟動生成: 項目: MyDLL, 配置: Debug Win32 ------ 1> dllmain.cpp ========== 生成: 成功 1 個,失敗 0 個,最新 0 個,跳過 0 個 ========== 1>------ 已啟動生成: 項目: MyDLL, 配置: Debug Win32 ------ 1> stdafx.cpp 1> testdll.cpp 1> MyDLL.cpp 1> 正在生成代碼... 1> 正在創(chuàng)建庫 D:\Visual C++\工程\Libaray\MyDLL\Debug\MyDLL.lib 和對象 D:\Visual C++\工程\Libaray\MyDLL\Debug Ps:errorc2061 語法錯誤 標(biāo)識符

錯誤原因:是因為頭文件的順序不對。

解決方法:調(diào)整頭文件的順序。

轉(zhuǎn)自:http://liuyunfeng484.blog.163.com/blog/static/66831715201232810449824/


二、DLL的使用(靜態(tài)鏈接、隱式鏈接)

如何在C++中調(diào)用DLL中的函數(shù)

  應(yīng)用程序使用DLL可以采用兩種方式:一種是隱式鏈接,另一種是顯式鏈接。在使用DLL之前首先要知道DLL中函數(shù)的結(jié)構(gòu)信息。Visual C++6.0在VC\bin目錄下提供了一個名為Dumpbin.exe的小程序,用它可以查看DLL文件中的函數(shù)結(jié)構(gòu)。另外,Windows系統(tǒng)將遵循下面的搜索順序來定位DLL: 1.包含EXE文件的目錄,2.進(jìn)程的當(dāng)前工作目錄, 3.Windows系統(tǒng)目錄, 4.Windows目錄,5.列在Path環(huán)境變量中的一系列目錄。

1.隱式鏈接

  隱式鏈接就是在程序開始執(zhí)行時就將DLL文件加載到應(yīng)用程序當(dāng)中。實現(xiàn)隱式鏈接很容易,只要將導(dǎo)入函數(shù)關(guān)鍵字_declspec(dllimport)函數(shù)名等寫到應(yīng)用程序相應(yīng)的頭文件中就可以了。下面的例子通過隱式鏈接調(diào)用MyDll.dll庫中的Min函數(shù)。首先生成一個項目為TestDll,在DllTest.h、DllTest.cpp文件中分別輸入如下代碼:

?

//Dlltest.h #pragma comment(lib,"MyDll.lib") extern"C"_declspec(dllimport) int Max(int a,int b); extern"C"_declspec(dllimport) int Min(int a,int b);//TestDll.cpp #include #include"Dlltest.h" void main() {int a; a=min(8,10) printf("比較的結(jié)果為%d\n",a);}

  在創(chuàng)建DllTest.exe文件之前,要先將MyDll.dll和MyDll.lib拷貝到當(dāng)前工程所在的目錄下面,也可以拷貝到windows的System目錄下。如果DLL使用的是def文件,要刪除TestDll.h文件中關(guān)鍵字extern "C"。TestDll.h文件中的關(guān)鍵字Progam commit是要Visual C+的編譯器在link時,鏈接到MyDll.lib文件,當(dāng)然,開發(fā)人員也可以不使用#pragma comment(lib,"MyDll.lib")語句,而直接在工程的Setting->Link頁的Object/Moduls欄填入MyDll.lib既可。

2.顯式鏈接

  顯式鏈接是應(yīng)用程序在執(zhí)行過程中隨時可以加載DLL文件,也可以隨時卸載DLL文件,這是隱式鏈接所無法作到的,所以顯式鏈接具有更好的靈活性,對于解釋性語言更為合適。不過實現(xiàn)顯式鏈接要麻煩一些。在應(yīng)用程序中用LoadLibrary或MFC提供的AfxLoadLibrary顯式的將自己所做的動態(tài)鏈接庫調(diào)進(jìn)來,動態(tài)鏈接庫的文件名即是上述兩個函數(shù)的參數(shù),此后再用GetProcAddress()獲取想要引入的函數(shù)。自此,你就可以象使用如同在應(yīng)用程序自定義的函數(shù)一樣來調(diào)用此引入函數(shù)了。在應(yīng)用程序退出之前,應(yīng)該用FreeLibrary或MFC提供的AfxFreeLibrary釋放動態(tài)鏈接庫。下面是通過顯式鏈接調(diào)用DLL中的Max函數(shù)的例子。

?

#include #include void main(void) { typedef int(*pMax)(int a,int b); typedef int(*pMin)(int a,int b);HINSTANCE hDLL; PMax MaxHDLL=LoadLibrary("MyDll.dll");//加載動態(tài)鏈接庫MyDll.dll文件;Max=(pMax)GetProcAddress(hDLL,"Max"); A=Max(5,8);Printf("比較的結(jié)果為%d\n",a);FreeLibrary(hDLL);//卸載MyDll.dll文件; }

  在上例中使用類型定義關(guān)鍵字typedef,定義指向和DLL中相同的函數(shù)原型指針,然后通過LoadLibray()將DLL加載到當(dāng)前的應(yīng)用程序中并返回當(dāng)前DLL文件的句柄,然后通過GetProcAddress()函數(shù)獲取導(dǎo)入到應(yīng)用程序中的函數(shù)指針,函數(shù)調(diào)用完畢后,使用FreeLibrary()卸載DLL文件。在編譯程序之前,首先要將DLL文件拷貝到工程所在的目錄或Windows系統(tǒng)目錄下。

  使用顯式鏈接應(yīng)用程序編譯時不需要使用相應(yīng)的Lib文件。另外,使用GetProcAddress()函數(shù)時,可以利用MAKEINTRESOURCE()函數(shù)直接使用DLL中函數(shù)出現(xiàn)的順序號,如將GetProcAddress(hDLL,"Min")改為GetProcAddress(hDLL, MAKEINTRESOURCE(2))(函數(shù)Min()在DLL中的順序號是2),這樣調(diào)用DLL中的函數(shù)速度很快,但是要記住函數(shù)的使用序號,否則會發(fā)生錯誤。

warning LNK4070exp : warning LNK4070: .EXP中的 /OUT:A.dll指令與輸出文件名"../outdir/Debug/B.dll"不同;忽略指令

產(chǎn)生原因是:這個工程的def文件中LIBRARY字段的值和輸出文件不一樣造成的。

解決辦法:修改LIBRARY字段的值,使得和輸出文件保持一致。


轉(zhuǎn)自:http://blog.163.com/gost_008/blog/static/87202204200862932528217/

三:DLL的模塊定義文件(.DEF??

動態(tài)連接庫函數(shù)或者成員的導(dǎo)出可以用

_declspec(dllexport)來實現(xiàn),比如為了導(dǎo)出voidSayHello()函數(shù),則在DLL文件中這么聲明(或者定義):

_declspec(dllexport)void SayHello();

也可以不用_declspec(dllexport),而采用.def文件來說明要導(dǎo)出的函數(shù)或成員:

.def文件的格式:

LIBRARYABC //ABC.dll文件的名字,也就是dll工程的名字

EXPORTS

SayHello@1

這樣,就從ABC.dll文件中導(dǎo)出了SayHello這個函數(shù),

后面的那個"@1"的含義為:

從動態(tài)連接庫文件中導(dǎo)出的函數(shù)或者成員可以用名字來標(biāo)識,也可以用序號來表示,一般情況下用名字來標(biāo)識,序號由系統(tǒng)來設(shè)置,但是也可以用"@1"的格式來自己定義,表示SayHello函數(shù)的序號為1

不想使用__declspec(dllexport)而單獨(dú)使用.def文件導(dǎo)出類,不知道如何實現(xiàn)?1,把你要從dll輸出的每個類,都設(shè)計一個基類,這是個純虛,即所有函數(shù)都是“virtual...=0;”的。把這些寫成一個.h???

? ??? 2,把dll里的類都從相應(yīng)的基類派生,并實現(xiàn)每一個純虛函數(shù)。并給dll設(shè)計一個可動態(tài)導(dǎo)出的函數(shù),這個函數(shù)里???return??? new??? CxxxInDll; ??

? ??? 3,在調(diào)用dll的程序里定義純虛基類的指針,并賦予第二步返回的值。? ?

???現(xiàn)在可以動態(tài)加載、調(diào)用dll里的類了。看看COM原理,你就有啟發(fā)了。熟練了后會發(fā)現(xiàn)這個方法在小型應(yīng)用里非常有效!(在大型應(yīng)用里,由于缺乏生存期控制,所以不安全)? ?

? ????需要補(bǔ)充的是:需要為每個類增加定義一個Release函數(shù),函數(shù)里delete???this,不要在調(diào)用dll的程序里直接delete從第二步獲得的指針。


四:我的方法


?對于Vs建立DLL文件的方法過程為:

(1):建立一個空工程,命名

(2):把工程生成文件設(shè)置為DLL

(3):添加現(xiàn)有項目,把類里面對外展示的Public成員函數(shù),在頭文件函數(shù)聲明前面添加_declspec(dllexport)

(4):切記:要把構(gòu)造函數(shù)和析構(gòu)函數(shù)前面也加上_declspec(dllexport)

(5):生成dll文件,在工程的Release或者Debug文件夾里面會生成DLL和LIb文件,然后整個項目.h文件,DLL和LIb文件 為最后需要的文件



總結(jié)

以上是生活随笔為你收集整理的将自己的类封装为lib的方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 制服丝袜一区 | 日韩毛毛片 | 久操中文 | 国产精品久久久久久久久免费相片 | 国产伊人网 | 成人免费看片98 | 欧洲成人在线视频 | 日韩专区一区二区三区 | 日本老少交 | 国产精品无码白浆高潮 | 美日韩一级 | 在线免费观看污片 | 亚洲不卡视频 | 日本黄色的视频 | 2019毛片| 韩日三级视频 | 狂野欧美性猛交xxxx777 | 少妇aa| 国产第一精品 | 亚洲午夜电影网 | 最新91视频 | 四虎影视免费永久大全 | 七月色| 色综合中文网 | 男人的天堂毛片 | 男人和女人插插 | 久久妇女 | 亚洲国产视频一区二区三区 | 边吃奶边添下面好爽 | 日本不卡一区在线 | 久久av在线播放 | 天天草比| 久久久久久久无码 | 伊人影院99| 毛片一卡二卡 | 日本精品久久久久久 | 日韩在线播放av | 欧美老女人性生活视频 | 午夜精品久久久内射近拍高清 | av不卡高清 | 邵氏电影《金莲外传2》免费观看 | 91麻豆一区二区三区 | 亚洲国产精品第一页 | 好吊妞视频一区二区三区 | 国产调教在线 | 深夜福利网址 | 16一17女人毛片 | 久久国产成人精品国产成人亚洲 | 国产午夜精品久久久久 | 黄av网| 樱花草涩涩www在线播放 | 大桥未久av在线 | 国产欧美精品一区二区 | いいなり北条麻妃av101 | 美日韩av在线 | av小次郎收藏 | 国产黄色片在线 | 污视频在线观看网址 | 亚洲日本视频 | 大香焦久久 | 91一起草 | 亚洲自拍天堂 | 欧美午夜精品久久久久久人妖 | 亚洲狠| 国产欧美在线 | 日韩成人在线观看 | 小早川怜子久久精品中文字幕 | 西西人体做爰大胆gogo直播 | 在线观看中文字幕一区 | 亚洲女人av | 中文字幕在线一区 | 国产白丝精品91爽爽久久 | 男女无遮挡免费视频 | 日韩一级免费毛片 | 亚洲日日骚 | 精品国产av无码一区二区三区 | 91精品国产综合久久久蜜臀图片 | 国产区精品 | 天堂av亚洲av国产av电影 | 欧美波霸影院 | 中国字幕一色哟哟 | 成人免费在线视频网站 | 亚洲成人观看 | 91成人网页| 亚洲自拍另类 | 粉嫩av一区二区白浆 | 91精品国产手机 | 中文有码一区 | 国产精品男同 | 日本不卡一区二区三区在线观看 | 在线免费日本 | 成人h视频 | 久久精品a| 在线观看视频色 | 全部毛片永久免费看 | 欧美性受xxxx黑人 | 东京干手机福利视频 | 99在线精品视频免费观看20 | 国产suv一区二区 |