C++ 調(diào)用dll的方法小結(jié)
動態(tài)鏈接庫
動態(tài)鏈接庫也被叫做為dll,是Dynamic Link Library的縮寫。dll是一個被其他應(yīng)用程序調(diào)用的程序模塊,其中封裝了可以被調(diào)用的資源或函數(shù)。dll不能夠單獨運行,它是依附于exe文件創(chuàng)建的進程來執(zhí)行的。每個程序都可以通過鏈接dll使用其中包含的接口函數(shù),這有助于避免代碼重用和促進內(nèi)存的有效使用,使程序?qū)崿F(xiàn)模塊化,只在相應(yīng)的功能被請求時才加載相應(yīng)模塊。
另外,調(diào)用者只需要根據(jù)自己要實現(xiàn)的功能調(diào)用dll中對應(yīng)的接口,而不需要知道每個接口函數(shù)具體的實現(xiàn)。dll的開發(fā)者可以通過dll隱藏接口的代碼實現(xiàn),比如你只想讓其他人使用你的算法,但不想讓其他人知道你的算法和邏輯代碼,就可以把它們封裝到dll中。這樣,調(diào)用人的程序中不會包含算法實際的實現(xiàn)代碼,而只有調(diào)用dll的接口代碼。
建立一個DLL
打開Visual Studio,新建 -> 項目 -> Visual C++ -> 動態(tài)鏈接庫

使用__declspec(dllexport)關(guān)鍵字導出dll
添加頭文件arithmetic.h 在頭文件中添加導出函數(shù)add函數(shù):
#ifdef __cplusplus // 一般用于將C++代碼以標準C形式輸出(即以C的形式被調(diào)用)
extern"C"{ // 告訴編譯器下面大括號括起來的函數(shù)是c語言函數(shù)(因為c++和c語言對函數(shù)的編譯轉(zhuǎn)換不一樣,主要是c++中存在重載)
#endif
__declspec(dllexport) int __stdcall add(int a, int b); // __declspec(dllexport)聲明導出該函數(shù)供外部調(diào)用
__declspec(dllexport) int __stdcall subtruct(int a, int b); // __stdcall是Windows API默認的函數(shù)調(diào)用協(xié)議,函數(shù)采用從右到左的壓棧方式,自己在退出時清空堆棧,也可以不使用
#ifdef __cplusplus
}
#endif__cplusplus是c++中的自定義宏,這個宏表示這是一段C++的代碼。 在C++中,為了支持重載機制,在編譯生成的匯編碼中,要對函數(shù)的名字進行一些處理,加入比如函數(shù)的返回類型等等.而在C中,只是簡單的函數(shù)名字而已,不會加入其他的信息.也就是說:C++和C對產(chǎn)生的函數(shù)名字的處理是不一樣的。這里使用extern "C"就是告訴編譯器,以C的方式來鏈接它括起來的函數(shù)。上面的函數(shù)的含義就是:如果這是一段C++代碼,那么加入extern "C"處理大括號中的代碼。
再添加arithmetic.cpp文件實現(xiàn)函數(shù):
#include "Arithmetic.h"
int __stdcall add(int a, int b)
{
return a + b;
}
int __stdcall subtruct(int a, int b)
{
return a - b;
}
編寫好之后,我們直接右鍵項目名,點生成就可以項目路徑下的debug文件夾里找到我們生成的dll和lib文件


查看DLL中的函數(shù)
有時候,我們需要調(diào)用已經(jīng)寫好的dll,但是我們不知道這個dll中有什么函數(shù)。我們可以在Visual Studio的安裝目錄\Common7\Tools\Bin下,找到微軟提供的查看已有dll中函數(shù)名的工具Dependency Walker

我們只需要把剛才生成的dll文件拖進Dependency中,就可以看到這個dll中所包含的函數(shù)名以及它所依賴的dll

調(diào)用DLL
一、靜態(tài)調(diào)用
1. 我們測試一下調(diào)用這個剛才創(chuàng)建的DLLTest的dll,首先創(chuàng)建一個工程,添加如下代碼:
#include <iostream>
#pragma comment(lib, "DllTest.lib") // 告訴程序lib文件的路徑,這里就表示當前目錄
extern "C" __declspec(dllimport) int __stdcall add(int a, int b); // 這里使用__declspec(dllimport),正好和生成dll時的__declspec(dllexport)對應(yīng)
extern "C" __declspec(dllimport) int __stdcall subtruct(int a, int b); // 生成dll時沒有加__stdcall的話,這里也不用加
int main()
{
int a = 3;
int b = 2;
std::cout << "add result is: " << add(a, b) << std::endl;
std::cout << "subtruct result is: " << subtruct(a, b) << std::endl;
}要把生成的lib文件放到和工程代碼的統(tǒng)一路徑下,在然后將dll文件放到和程序要生成的EXE文件同一路徑下:


運行程序,可以看到調(diào)用成功:

2 . 當我們要導入好幾個dll,且這些dll中有很多函數(shù)時,可以為每個dll新建一個頭文件來聲明導入的函數(shù),如我們新建一個Arithmetic.h的頭文件,把DllTest.dll中所有的函數(shù)聲明都寫在這里:
#ifdef __cplusplus
extern "C" {
#endif
__declspec(dllimport) int __stdcall add(int a, int b);
__declspec(dllimport) int __stdcall subtruct(int a, int b);
#ifdef __cplusplus
}
#endif然后在所有用到這個dll中函數(shù)的cpp文件中包含這個頭文件,就可以使用dll中的函數(shù)了
#include <iostream>
#include "Arithmetic.h"
int main()
{
int a = 3;
int b = 2;
std::cout << "add result is: " << add(a, b) << std::endl;
std::cout << "subtruct result is: " << subtruct(a, b) << std::endl;
}然后我們還需要添加lib庫,可以新建一個名為Lib的文件夾,把所有的dll的lib文都放在里面。然后直接右鍵項目,選擇屬性,在屬性配置→鏈接器→常規(guī)→附加庫目錄里添加這個Lib文件夾的路徑

然后在鏈接器→輸入→附加依賴項中添加lib文件的名字,最后一樣要把dll文件放在程序要生成的EXE文件同一路徑下

運行程序,可以得到和上面一樣的結(jié)果。
二、動態(tài)調(diào)用
動態(tài)調(diào)用不是鏈接時完成的,而是在運行時完成的,動態(tài)調(diào)用不會在可執(zhí)行文件中寫入DLL相關(guān)的信息,而是直接調(diào)用dll中的函數(shù)。
// 動態(tài)調(diào)用DLL庫
void DynamicUse()
{
// 運行時加載DLL庫
HMODULE module = LoadLibraryA("DLLTest1.dll"); // 根據(jù)DLL文件名,加載DLL,返回一個模塊句柄
if (module == NULL)
{
printf("加載DLLTest1.dll動態(tài)庫失敗\n");
return;
}
typedef int(*AddFunc)(int, int); // 定義函數(shù)指針類型
AddFunc add;
// 導出函數(shù)地址
add = (AddFunc)GetProcAddress(module, "add"); // GetProcAddress返回指向的函數(shù)名的函數(shù)地址
int sum = add(100, 200);
printf("動態(tài)調(diào)用,sum = %d\n",sum);
}一般使用動態(tài)調(diào)用,都是調(diào)用一些系統(tǒng)dll中的幾個函數(shù)函數(shù)時使用這種方法,因為調(diào)用我們自己寫的dll時,很多函數(shù)都會經(jīng)常用到,動態(tài)調(diào)用就太麻煩了。
到此這篇關(guān)于C++ 調(diào)用dll的方法小結(jié)的文章就介紹到這了,更多相關(guān)C++ 調(diào)用dll內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用c語言判斷100以內(nèi)素數(shù)的示例(c語言求素數(shù))
這篇文章主要介紹了使用c語言判斷100以內(nèi)素數(shù)的示例(c語言求素數(shù)),需要的朋友可以參考下2014-03-03

