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

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

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

2020-01-26 14:28:57
字體:
來源:轉載
供稿:網友

本文實例講述了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午夜| 久久激情视频免费观看| 亚洲成人精品视频在线观看| 日韩美女视频中文字幕| 国产精品视频99| 日韩av色在线| 一区二区在线免费视频| 中文字幕亚洲精品| 国产精品揄拍一区二区| 亚洲男人av在线| 尤物tv国产一区| www国产精品视频| 热99精品里视频精品| 亚洲电影成人av99爱色| 亚洲aⅴ男人的天堂在线观看| 久久久久久久久国产| 2025国产精品视频| 国产亚洲精品综合一区91| 欧美精品激情在线观看| 久久av资源网站| 91成人在线视频| 午夜精品美女自拍福到在线| 欧美激情第99页| 亚洲free性xxxx护士白浆| 久久精品国产欧美亚洲人人爽| 少妇高潮 亚洲精品| 欧美激情精品久久久久久久变态| 高清一区二区三区日本久| 欧美成人免费va影院高清| 色一情一乱一区二区| 欧美肥婆姓交大片| 美日韩在线视频| 国产精品成人观看视频国产奇米| 成人在线视频网| 日韩中文字幕在线观看| 91国偷自产一区二区三区的观看方式| 成人精品久久av网站| 日韩在线精品视频| 亚洲黄色有码视频| 精品国产拍在线观看| 国产精品网站大全| 精品视频在线播放色网色视频| 姬川优奈aav一区二区| 成人免费淫片aa视频免费| 久久人人爽人人| 国产97人人超碰caoprom| 国产成人免费av| 日韩av在线最新| 97色在线观看免费视频| 久久久这里只有精品视频| 久热精品视频在线观看| 欧美大全免费观看电视剧大泉洋| 米奇精品一区二区三区在线观看| 精品在线小视频| 欧美不卡视频一区发布| 成人网在线免费看| 久久久久久久香蕉网| 国产色综合天天综合网| 日韩在线视频网站| 亚洲欧美激情精品一区二区| 久久综合久中文字幕青草| 国产成人精品一区二区在线| 欧美一区二粉嫩精品国产一线天| 精品久久久视频| 欧美激情视频一区二区三区不卡| 久久精品免费电影| 日韩在线中文视频| 国产精品午夜国产小视频| 日韩有码视频在线| 久久久av一区| 国产99久久久欧美黑人| 日韩有码在线观看| 亚洲国产成人在线视频| 亚洲色在线视频| 日韩一级裸体免费视频| 91啪国产在线| 黑人与娇小精品av专区| 成人精品视频99在线观看免费| 久久久97精品| 亚洲人线精品午夜| 青青草99啪国产免费| 一区二区欧美日韩视频| 亚洲一区美女视频在线观看免费| 国产精品高潮呻吟久久av野狼| 国产一区二区三区视频免费| 成人免费视频xnxx.com| 日韩视频亚洲视频| 91av免费观看91av精品在线| 一区二区三区视频免费在线观看| 亚洲理论在线a中文字幕| 麻豆乱码国产一区二区三区| 中文字幕在线看视频国产欧美| 欧美成人在线免费视频| 欧美日韩国产一区二区三区| 欧美尤物巨大精品爽| 日韩高清免费在线| 在线视频欧美性高潮| 午夜精品一区二区三区av| 欧美精品18videos性欧美| 欧美人与物videos| 色综合亚洲精品激情狠狠| 欧日韩不卡在线视频| 久久精品国产99国产精品澳门| 国产精品久久久久一区二区| 97久久超碰福利国产精品…| 亚洲www在线观看| 精品视频中文字幕| 色婷婷久久av| 亚洲影视九九影院在线观看| 久久不射热爱视频精品| 国产丝袜一区二区三区免费视频| 亚洲欧洲一区二区三区久久| 亚洲欧美色婷婷| 在线观看不卡av| 国产成人精品一区二区三区| 国产一区二区视频在线观看| 亚洲欧美日韩天堂| 国语自产偷拍精品视频偷| 美女性感视频久久久| 国产在线视频一区| 中文字幕精品在线| 5566日本婷婷色中文字幕97| 国产免费成人av| 日韩在线播放一区| www日韩欧美| 热门国产精品亚洲第一区在线| 清纯唯美日韩制服另类| 日本久久久久久久久久久| 亚洲天堂男人天堂| 国产精品极品美女在线观看免费| 欧美裸体xxxx极品少妇| 亚洲色图25p| 久久久女女女女999久久| 国产精品成人久久久久| 亚洲伊人久久大香线蕉av| 亚洲精品福利视频| 亚洲国产精品久久久久秋霞蜜臀| 精品久久香蕉国产线看观看gif| 日韩在线视频观看| 亚洲视频在线观看免费| 国产日产亚洲精品| 欧美一区二区三区……| 欧日韩在线观看| 一区二区三区www| 欧美综合在线观看| 日韩欧美综合在线视频| 成人黄色大片在线免费观看| 欧美肥臀大乳一区二区免费视频| 日韩精品极品在线观看播放免费视频| 国产精品毛片a∨一区二区三区|国| 91欧美精品成人综合在线观看| 国产精品免费在线免费| 国产丝袜精品视频| 久久久久久国产| 国产成人一区三区| 国内精品小视频在线观看| 大伊人狠狠躁夜夜躁av一区| 欧美性生活大片免费观看网址| 国产成人拍精品视频午夜网站| 日韩在线免费视频| 成人久久一区二区三区| 欧美高清激情视频| 中文字幕亚洲一区在线观看| 亚洲天堂色网站|