最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ 調(diào)用dll的方法小結(jié)

 更新時間:2026年05月08日 09:55:45   作者:Sakuya__  
本文主要介紹了C++ 調(diào)用dll的方法小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

動態(tài)鏈接庫

動態(tài)鏈接庫也被叫做為dll,是Dynamic Link Library的縮寫。dll是一個被其他應(yīng)用程序調(diào)用的程序模塊,其中封裝了可以被調(diào)用的資源或函數(shù)。dll不能夠單獨運行,它是依附于exe文件創(chuàng)建的進(jìn)程來執(zhí)行的。每個程序都可以通過鏈接dll使用其中包含的接口函數(shù),這有助于避免代碼重用和促進(jìn)內(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)鍵字導(dǎo)出dll

添加頭文件arithmetic.h 在頭文件中添加導(dǎo)出函數(shù)add函數(shù):

#ifdef __cplusplus         // 一般用于將C++代碼以標(biāo)準(zhǔn)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)聲明導(dǎo)出該函數(shù)供外部調(diào)用
__declspec(dllexport) int __stdcall  subtruct(int a, int b); // __stdcall是Windows API默認(rèn)的函數(shù)調(diào)用協(xié)議,函數(shù)采用從右到左的壓棧方式,自己在退出時清空堆棧,也可以不使用
#ifdef __cplusplus
}
#endif

__cplusplus是c++中的自定義宏,這個宏表示這是一段C++的代碼。 在C++中,為了支持重載機制,在編譯生成的匯編碼中,要對函數(shù)的名字進(jìn)行一些處理,加入比如函數(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文件拖進(jìn)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文件的路徑,這里就表示當(dāng)前目錄
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 . 當(dāng)我們要導(dǎo)入好幾個dll,且這些dll中有很多函數(shù)時,可以為每個dll新建一個頭文件來聲明導(dǎo)入的函數(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;
    // 導(dǎo)出函數(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)文章

  • Qt?http編程之nlohmann?json庫使用詳解

    Qt?http編程之nlohmann?json庫使用詳解

    nlohmann是一個C++的JSON庫,它提供了方便的方式來解析、生成和操作JSON數(shù)據(jù),這篇文章主要為大家介紹了nlohmann?json庫的簡單使用,希望對大家有所幫助
    2024-04-04
  • 使用c語言判斷100以內(nèi)素數(shù)的示例(c語言求素數(shù))

    使用c語言判斷100以內(nèi)素數(shù)的示例(c語言求素數(shù))

    這篇文章主要介紹了使用c語言判斷100以內(nèi)素數(shù)的示例(c語言求素數(shù)),需要的朋友可以參考下
    2014-03-03
  • C語言實現(xiàn)影院售票管理系統(tǒng)

    C語言實現(xiàn)影院售票管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)影院售票管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C/C++獲取目錄下的文件列表信息

    C/C++獲取目錄下的文件列表信息

    在C/C++編程時,需要獲取目錄下面的文件列表信息,下面把代碼分享一下
    2014-02-02
  • 深入了解C語言中的動態(tài)內(nèi)存分配

    深入了解C語言中的動態(tài)內(nèi)存分配

    這篇文章主要為大家詳細(xì)介紹了C語言中的動態(tài)內(nèi)存分配,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)C語言有一定的幫助,需要的可以參考一下
    2022-06-06
  • C++中輸出十六進(jìn)制形式的字符串

    C++中輸出十六進(jìn)制形式的字符串

    這篇文章主要給大家介紹了C++中輸出十六進(jìn)制形式的字符串,文中給出了詳細(xì)的介紹,有需要的朋友可以參考借鑒,下面來一起看看吧。
    2016-12-12
  • Qt實現(xiàn)UDP通信的示例代碼

    Qt實現(xiàn)UDP通信的示例代碼

    UDP是一個輕量級、不可靠、面向數(shù)據(jù)報的、無連接的傳輸層協(xié)議,多用于可靠性要求不嚴(yán)格,不是非常重要的傳輸,如直播、視頻會議等等。本文將通過Qt實現(xiàn)UDP通信,感興趣的可以了解一下
    2022-11-11
  • C語言練習(xí)之?dāng)?shù)組中素數(shù)交換

    C語言練習(xí)之?dāng)?shù)組中素數(shù)交換

    這篇文章主要為大家介紹了C語言數(shù)組中素數(shù)交換,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助<BR>
    2021-12-12
  • C++設(shè)計模式之適配器模式

    C++設(shè)計模式之適配器模式

    這篇文章主要介紹了C++設(shè)計模式之適配器模式,本文詳細(xì)講解了C++中的適配器模式,并給出了實現(xiàn)代碼,需要的朋友可以參考下
    2014-09-09
  • 適合初學(xué)者練習(xí)的C語言實現(xiàn)三子棋小游戲

    適合初學(xué)者練習(xí)的C語言實現(xiàn)三子棋小游戲

    今天這篇文章主要介紹給大家分享一個適合初學(xué)者練習(xí)的利用C語言寫三子棋小游戲,用簡單的C語言來實現(xiàn)小時候玩的三子棋游戲,下面是人機對戰(zhàn),當(dāng)然這個代碼的電腦對手是人工智障而不是人工智能 詳細(xì)內(nèi)容就請跟小編一起來閱讀下面文章內(nèi)容吧
    2021-10-10

最新評論

龙门县| 新安县| 甘洛县| 延川县| 江津市| 麻江县| 辽阳市| 翁源县| 县级市| 辽源市| 蕲春县| 常德市| 沂南县| 固阳县| 黎城县| 三江| 延边| 同仁县| 华坪县| 安龙县| 高密市| 河源市| 沁水县| 桃江县| 通化县| 筠连县| 敦化市| 卓资县| 拉孜县| 长岛县| 萨嘎县| 台安县| 万州区| 新闻| 和政县| 远安县| 固阳县| 十堰市| 麻栗坡县| 濮阳市| 加查县|