国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

c++創建與調用dll

2019-11-06 07:11:37
字體:
來源:轉載
供稿:網友


一、新建生成dll工程文件:

如果你使用的是VISUAL STUDIO1、從“文件”菜單中,選擇“新建”,然后選擇“項目…”。2、從“項目類型”窗格中選擇“Visual C++”下的“Win32”。3、從“模板”窗格中,選擇“Win32 控制臺應用程序”。4、為項目選擇一個名稱,如“MathFuncsDll”,并將其輸入“名稱”字段。為解決方案選擇一個名稱,如“DynamicLibrary”,并將其輸入“解決方案名稱”字段。5、按“確定”啟動 Win32 應用程序向導。在“Win32 應用程序向導”對話框的“概述”頁中,按“下一步”。6、從“Win32 應用程序向導”中的“應用程序設置”頁中,選擇“應用程序類型”下的“DLL”(如果可用),或者選擇“控制臺應用程序”(如果“DLL”不可用)。某些版本的 Visual Studio 不支持使用向導創建 DLL 項目。您可以稍后對此進行更改,以將項目編譯為 DLL。7、從“Win32 應用程序向導”的“應用程序設置”頁中,選擇“附加選項”下的“空項目”。

 

二、生成dll程序

extern "C"_declspec(dllexport) void maopao(int *p,int count);void maopao(int *p,int count){  int temp=0; for(int i=1;i<count;i++) {  for(int j=count-1;j>=i;j--)  {    if(p[j]>p[j-1])   {    temp=p[j];    p[j]=p[j-1];    p[j-1]=temp;   }  } }}

 

 

三、新建調用dll工程文件:

如果你使用的是VISUAL STUDIO1、從“文件”菜單中,選擇“新建”,然后選擇“項目…”。2、從“項目類型”窗格中選擇“Visual C++”下的“Win32”。3、從“模板”窗格中,選擇“Win32 控制臺應用程序”。4、為項目選擇一個名稱,如“MathFuncsDll”,并將其輸入“名稱”字段。為解決方案選擇一個名稱,如“DynamicLibrary”,并將其輸入“解決方案名稱”字段。5、按“確定”啟動 Win32 應用程序向導。在“Win32 應用程序向導”對話框的“概述”頁中,按“下一步”。6、從“Win32 應用程序向導”中的“應用程序設置”頁中,選擇“應用程序類型”下的“Console application”,或者選擇“控制臺應用程序”(如果“DLL”不可用)。某些版本的 Visual Studio 不支持使用向導創建 DLL 項目。您可以稍后對此進行更改,以將項目編譯為 DLL。7、從“Win32 應用程序向導”的“應用程序設置”頁中,選擇“附加選項”下的“空項目”。

 

四、調用dll文件(在調用dll時再)

#include<iostream>#include<Windows.h>#include<time.h>

typedef int(*Dllfun)(int *,int);using namespace std;

int main(){  Dllfun maopao1; HINSTANCE hdll; hdll=LoadLibrary("D://company//soft//C//maopao_dll//Debug//maopao_dll.dll"); if(hdll==NULL) {  FreeLibrary(hdll); }

 maopao1=(Dllfun)GetPRocAddress(hdll,"maopao"); if(maopao1==NULL) {  FreeLibrary(hdll); } int a[10]; srand(time(0)); for(int i=0;i<10;i++)  a[i]=rand()%50;

 for(int i=0;i<10;i++)  cout<<a[i]<<' ';  cout<<endl;

 maopao1(a,10); for(int i=0;i<10;i++)  cout<<a[i]<<' ';

 FreeLibrary(hdll);

}

 

備注:

C++如何調用DLL呢,有兩種,一種是靜態,另外一種是動態,即通過調用windowsAPI 來加載和卸載DLL,具體思路:

1.先編寫一個DLL,我這里是直接在CPP里編寫了函數聲明和定義,沒有單獨的頭文件,因為很多情況下的DLL都是沒有和lib和頭文件一起的。

2.然后另外新建一個項目,來調用DLL,方法是:

1.聲明頭文件<windows.h>,說明我想用windows32方法來加載和卸載DLL

2.然后用typedef定義一個指針函數類型.typedef  void(*fun) //這個指針類型,要和你調用的函數類型和參數保持一致,記住,是指針參數就是(int *,int)

3.定一個句柄實例,用來取DLL的實例地址。HINSTANCE hdll;

格式為hdll=LoadLibrary(“DLL地址”);這里字符串類型是LPSTR,當是unicode字符集的時候會不行,因此要在工程--屬性--常規---默認字符集:把“unicode”改成支持多字符擴展即可。

4.取的地址要判斷,返回的句柄是否為空,如果為無效句柄,那么要釋放加載DLL所占用的內存。

FreeLibrary(hdll);

5.然后定義一個函數指針,用來獲取你要用的函數地址,這個咋用呢?

先是定一個函數指針 fun FUN;然后通過GetProcAdress來獲取函數的地址,這個函數參數是什么呢?

參數是DLL的句柄和你要調用的函數名:比如:FUN=(fun)GetProcAdress(hdll,"sum");

這里也要判斷要函數指針是否為空,如果沒取到要求的函數,那么要釋放句柄

FreeLibrary(hdll);

6.然后通過函數指針來調用函數。

FUN(int *p,int count);這里不能用函數名來使用函數,因為這個DLL本身不是當前CPP的一部分,而是通過windows去調用.沒有在這個工程里聲明或者定義,而是暴露出一個頭,要指針獲取他的地址,通過指針來調用.

最后調用結束后,就釋放句柄

FreeLibrary(hdll);

這里只是通過動態加載沒有涉及到靜態的。這個在后續會學習。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 诏安县| 岳阳县| 绩溪县| 凤庆县| 永州市| 习水县| 体育| 明光市| 伊川县| 玉田县| 噶尔县| 宁陵县| 延安市| 雷波县| 海宁市| 衡阳县| 孝义市| 平凉市| 东城区| 宝应县| 平度市| 尚志市| 香港 | 广水市| 蒲城县| 比如县| 上高县| 陆河县| 东乡族自治县| 永胜县| 屏东市| 海南省| 龙陵县| 六枝特区| 湘潭市| 内丘县| 柳江县| 晋中市| 寿宁县| 张家港市| 黎平县|