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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

在C++中调用DLL中的函数(2)

發布時間:2023/12/9 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在C++中调用DLL中的函数(2) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文轉自:http://blog.sina.com.cn/s/blog_53004b4901009h3b.html
?

應用程序使用DLL可以采用兩種方式:

一種是隱式鏈接,另一種是顯式鏈接。在使用DLL之前首先要知道DLL中函數的結構信息。

Visual C++6.0VC\bin目錄下提供了一個名為Dumpbin.exe的小程序,用它可以查看DLL文件中的函數結構。另外,Windows系統將遵循下面的搜索順序來定位DLL

1.包含EXE文件的目錄,

2.進程的當前工作目錄,

3Windows系統目錄,

4Windows目錄,

5.列在Path環境變量中的一系列目錄。

1.隱式鏈接

  隱式鏈接就是在程序開始執行時就將DLL文件加載到應用程序當中。實現隱式鏈接很容易,只要將導入函數關鍵字_declspec(dllimport)函數名等寫到應用程序相應的頭文件中就可以了。

隱式鏈接采用靜態加載的方式,比較簡單,需要.h、.lib.dll三件套。新建控制臺應用程序空項目。配置如下:

項目->屬性->配置屬性->VC++ 目錄-> 包含目錄里添加頭文件Mydll.h所在的目錄?
項目->屬性->配置屬性->VC++ 目錄-> 庫目錄里添加頭文件Mydll.lib所在的目錄?
項目->屬性->配置屬性->鏈接器->輸入-> 附加依賴項里添加“Mydll.lib”(若有多個 lib 則以空格隔開)
下面的例子通過隱式鏈接調用MyDll.dll庫中的Min函數。首先生成一個項目為testDLL,在testDLL.h、testDLL.cpp文件中分別輸入如下代碼:

?//testDLL.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("比較的結果為%d\n",a);
}

?在創建DllTest.exe文件之前,要先將MyDLL.dllMyDLL.lib拷貝到當前工程可執行文件所在的目錄下面(非常重要),也可以拷貝到windowsSystem目錄下。如果DLL使用的是def文件,要刪除testDLL.h文件中關鍵字extern "C"。testDLL.h文件中的關鍵字Progam commit是要Visual C+的編譯器在link時,鏈接到MyDll.lib文件,當然,開發人員也可以不使用#pragma comment(lib"MyDLL.lib")語句,而直接在工程的Setting->Link頁的Object/Moduls欄填入MyDll.lib既可。

2.顯式鏈接

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

?#include

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

?

?

?

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

?

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

?

?

?

?

?

?

?

?

?

?

?

總結

以上是生活随笔為你收集整理的在C++中调用DLL中的函数(2)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。