亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++編寫DLL動態鏈接庫的步驟與實現方法

2020-05-23 14:01:12
字體:
來源:轉載
供稿:網友

本文實例講述了C++編寫DLL動態鏈接庫的步驟與實現方法。分享給大家供大家參考,具體如下:

在寫C++程序時,時常需要將一個class寫成DLL,供客戶端程序調用。這樣的DLL可以導出整個class,也可以導出這個class的某個方法。

一、導出整個class

方法很簡單,只需要在類的頭文件中class和類名之間加上_declspec(dllexport),同時在另外一份提供給客戶端調用程序使用的類的頭文件中class和類名之間加上_declspec(dllimport)。為了能讓客戶端程序和DLL程序公用該類的一份頭文件,通常在類的頭文件中使用宏和預編譯指令來處理。如下DLLTest.h:

#ifdef DLL_TEST_API#else#define DLL_TEST_API _declspec(dllimport)#endifClass DLL_TEST_API CDLLTest{   Public:     CDLLTest();     ~CDLLTest();     int Add(int a, int b);};

DLLTest.cpp如下:

#define DLL_TEST_API  _declspec(dllexport)#include "DLLTest.h"

這樣,在DLL編譯時DLL_TEST_API被定義為_declspec(dllexport),而且客戶端程序編譯時它被定義為_declspec(dllimport)。

二、導出這個類的某個或者某幾個方法

這時,需要將_declspec(dllexport)放到成員函數名前,如DLLTest.h:

#ifdef DLL_TEST_API#else#define DLL_TEST_API _declspec(dllimport)#endifClass CDLLTest{   Public:      CDLLTest();         ~CDLLTest();      int DLL_TEST_API Add(int a, int b);};

但是,如果僅僅是這樣的話,當客戶端程序#include這個頭文件后,定義DLLTest這個類的一個對象后(靜態方式鏈接DLL),客戶端程序無法鏈接通過,會提示構造函數和析構函數無法解析,此時,需要將構造函數和析構函數前也加上DLL_TEST_API宏即可。

當然這里還有個問題就是類的函數在導出后,名字會發生變化,我們可以在函數名前再加上extern "C" ,如 extern "C" DLL_TEST_API int Add(int a ,int b);但這只解決了C與C++調用時名字變更問題,可靠的方法還是增加一個模塊定義文件def,在該文件中定義導出函數的名稱,我們將在后面看到樣例。

DLL編寫完成后,就只剩下客戶端程序如何去調用該DLL了,靜態方式調用DLL和動態方式調用DLL。

一、靜態方式調用DLL

這個方法就簡單了,將DLLTest.h頭文件和DLLTest.lib,DLLTest.dll文件拷貝到客戶端程序的當前目錄下,在客戶端程序中#include<DLLTest.h>,然后通過#pragma comment(lib,"DLLTest.lib")的方式引入lib庫,或者在客戶端程序的工程屬性里面增加對該lib文件的引入。

然后就可以在客戶端程序中如同使用本地的一個class一樣使用該DLL了,如:

CDLLTest dllTest;dllTest.Add(1,2);

二、動態方式調用DLL

動態調用這個DLL,就需要對這個class進行修改了。

首先,在DLLTest.cpp文件中增加一個全局函數,該函數可以返回這個class的一個實例,這樣,客戶端程序調用這個全局函數后,得到該class的實例,就可以調用該class的實例方法了。

extern "C" _declspec(dllexport) CDLLTest* GetInstance(){   return new CDLLTest;}

注:extern "C" 只是解決了c與c++編譯器之間的兼容問題,如果需要和其他編譯器之間兼容,可靠的辦法還是增加一個.def文件,文件內容如下:

LIBRARY "DLLTest"EXPORTSGetInstance = GetInstance

這樣就指定了DLL的函數導出后的名稱仍然不變。

這樣,客戶端程序就可以通過該函數來獲取class的一個實例了。如下:

先需要定義一個函數指針類型:

typedef CDllTestBase* (*pfGetInst)();//注:CDllTestBase類后面會介紹。HMOUDLE hMod = LoadLibrary( _T("DLLTest.DLL") );if(hMod){  pfGetInst pfGetInstance = (pfGetInst)GetProcAddress("GetInstance");  if( p )  {   //通過基類指針指向派生類對象    CDllTestBase * pInst = pfGetInstance ();   if( NULL != pInst )   {    pInst->Add( 1,2);   }      if( NULL != pInst )   {    //釋放對象    delete pInst;   }  }}

當然,這里還是需要include這個DLL的頭文件DLLTestBase.h,如果將之前所寫的頭文件DLLTest.h直接拷貝到客戶端程序的當前目錄下,并include進來的話,在編譯連接時,是無法通過的,我們需要對這個頭文件進行修改,首先增加一個.h 文件DLLTestBase.h,在這個文件中我們將需要在客戶端程序中調用的函數都命名成純虛函數,然后讓CDLLTest類繼承自CDLLTestBase類,DLLTestBase.h如下:

Class CDLLTestBase{  Public:    Virtual ~CDLLTestBase(){};//虛析構函數,且為內聯函數     Virtual int Add(int a, int b) = 0;}

DLLTest.h修改后如下:

#include "DLLTestBase.h"Class CDLLTest : public CDLLTestBase{  Public:    CDLLTest();    ~CDLLTest();    int Add(int a, int b);};

注:這里的DLLTestBase需要提供一個虛析構函數,這樣在客戶端程序中就可以通過基類指針來釋放派生類對象了。

這樣,只需要將DLLTestBase.h拷貝到客戶端程序的當前目錄下,然后在客戶端程序中#include"DLLTestBase.h",就可以如上面介紹一樣在客戶端程序中調用DLL里面的方法了。

希望本文所述對大家VC++程序設計有所幫助。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品www| 亚洲自拍偷拍网址| 成人午夜激情免费视频| 国产精品久久久久久搜索| 国产999在线观看| 国产日韩av在线播放| 久久久精品电影| 日韩av有码在线| 亚洲成人aaa| 日韩av片电影专区| 亚洲欧美在线第一页| 国产精品一区二区三区在线播放| 亚州国产精品久久久| 97激碰免费视频| www.色综合| 懂色av影视一区二区三区| 亚洲一区亚洲二区| 91亚洲精品久久久久久久久久久久| 国产精品日韩欧美| 日韩欧美精品在线观看| 日本久久久久久| 日本老师69xxx| 日韩性生活视频| 欧美在线视频免费播放| 91久久国产综合久久91精品网站| 国产精品女视频| 成人久久久久久| 国产精品久久久久一区二区| 亚洲欧美国产精品专区久久| 中文字幕亚洲欧美日韩在线不卡| 久热精品视频在线观看| 国产综合久久久久久| 日韩成人av在线播放| 亚洲国产欧美日韩精品| 欧美午夜激情小视频| 国产精品一区专区欧美日韩| 久久久亚洲福利精品午夜| 久久天天躁狠狠躁老女人| 最近2019年日本中文免费字幕| 欧美xxxx14xxxxx性爽| 91久久国产精品91久久性色| 国产91精品不卡视频| 国产精品女人久久久久久| 国产xxx69麻豆国语对白| 人人爽久久涩噜噜噜网站| 久久久久久69| 国产日韩综合一区二区性色av| 中文字幕亚洲色图| 欧美日韩国产成人在线观看| 欧美极品欧美精品欧美视频| 欧美极品少妇xxxxⅹ裸体艺术| 中文字幕在线看视频国产欧美在线看完整| 欧美激情国产精品| 在线看欧美日韩| 97热精品视频官网| 国产精品www网站| 国产欧美中文字幕| 亚洲色图偷窥自拍| 精品国产一区二区三区久久久狼| 欧美韩国理论所午夜片917电影| 在线亚洲男人天堂| 欧美理论片在线观看| 国产欧美精品日韩| 国产亚洲精品美女| 九九视频这里只有精品| 久久精品国产久精国产思思| 欧美最猛性xxxxx免费| 亚洲美女视频网| 亚洲国产日韩一区| 国产精品尤物福利片在线观看| 亚洲女人天堂视频| 欧美亚洲国产视频小说| 日韩欧美国产高清91| 日韩的一区二区| 国产精品美女www| 久久色在线播放| 日韩网站在线观看| 欧美国产日韩免费| 国产精品美女免费视频| 久久久国产精品一区| 国产精品久久久久久久久久久久久| 2020久久国产精品| 欧美日韩在线视频一区二区| 国产国产精品人在线视| 日韩av电影在线播放| 亚洲成人精品视频在线观看| 欧美性极品xxxx做受| 中文字幕在线国产精品| 色妞一区二区三区| 精品久久久免费| 亚洲高清一区二| 中文字幕精品一区二区精品| 亚洲视频精品在线| 久久久噜久噜久久综合| 97视频免费观看| 91精品视频免费看| 欧洲永久精品大片ww免费漫画| 亚洲成成品网站| 亚洲精品自在久久| 91高清视频免费观看| 日韩欧美在线视频| 免费97视频在线精品国自产拍| 欧美午夜精品在线| 欧美高清视频一区二区| 海角国产乱辈乱精品视频| 高清一区二区三区日本久| 中文字幕精品av| 亚洲一区亚洲二区亚洲三区| 日韩欧美在线观看视频| 欧洲亚洲妇女av| 欧美性xxxx| 91精品国产精品| 17婷婷久久www| 国产欧美一区二区三区久久| 91精品综合久久久久久五月天| 亚洲精品91美女久久久久久久| 亚洲香蕉av在线一区二区三区| 午夜精品国产精品大乳美女| 性欧美视频videos6一9| 福利一区视频在线观看| 亚洲第一视频在线观看| 欧美激情在线一区| 中文字幕日韩精品在线| 亚洲字幕一区二区| 久久国产精品99国产精| 97激碰免费视频| 欧美性xxxx极品高清hd直播| 久久99亚洲精品| 欧日韩在线观看| 成人午夜一级二级三级| 成人黄色免费在线观看| 亚洲欧美国产一本综合首页| 国产精品影院在线观看| 国产在线播放不卡| 亚洲精品av在线| 国产精品海角社区在线观看| 亚洲黄色成人网| 日韩国产精品视频| 国产视频久久久久| 久久精品国产69国产精品亚洲| 九九热r在线视频精品| 日本视频久久久| 97高清免费视频| 久久久久免费视频| 中文字幕在线视频日韩| 性色av一区二区咪爱| 91免费看视频.| 久久久亚洲天堂| 国产亚洲一区二区精品| 久久精品99久久香蕉国产色戒| 上原亚衣av一区二区三区| 欧美又大又硬又粗bbbbb| 欧美成人精品激情在线观看| 国产在线观看一区二区三区| 亚洲成人性视频| 51精品国产黑色丝袜高跟鞋| 日韩精品在线电影| 国产精品av网站| 亚洲va电影大全| 欧美在线视频在线播放完整版免费观看| 91精品综合久久久久久五月天| 久久亚洲精品毛片| 中文字幕精品影院| 91精品久久久久久久|