0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C++生成Dll與回調(diào)函數(shù)測試

lvxisi ? 來源:lvxisi ? 作者:lvxisi ? 2023-08-29 16:05 ? 次閱讀

1 生成DLL文件

1)打開VisualStudio,選擇創(chuàng)建新項(xiàng)目。

wKgZomTn_uCAZa2KAAEGKAnMq_M932.png

2)選擇c++的動(dòng)態(tài)鏈接庫

wKgaomTn_uKAI-BPAAEW2lDsSQM352.png

3)編寫項(xiàng)目名稱,對(duì)應(yīng)生成dll的名稱,此處命名為MyCallbacks

wKgZomTn_t2ALokBAABYAMkVdSQ299.png

4)右側(cè)資源管理器,在頭文件位置,添加新建項(xiàng)。

wKgZomTn_t-AOXmFAACkgMLZJQA567.pngwKgZomTn_t6AHBYUAAATTgn4HaU480.png

5)編寫相關(guān)頭文件

wKgaomTn_uKAJAf1AAGKmP2knjU382.png
#pragma once

#ifdef MY_SIMPLE_MATH_EXPORTS
#define MY_SIMPLE_MATH_API __declspec(dllexport)
#else
#define MY_SIMPLE_MATH_API __declspec(dllimport)
#endif

// 定義回調(diào)函數(shù)的簽名
typedef void (*CallbackFunction)(int a, int b, int& sum);

// 用于注冊(cè)回調(diào)函數(shù)的函數(shù)聲明
extern "C" MY_SIMPLE_MATH_API void RegisterCallback(CallbackFunction callback);

// 用于觸發(fā)回調(diào)函數(shù)的執(zhí)行的函數(shù)聲明
extern "C" MY_SIMPLE_MATH_API void TriggerCallback(int a, int b, int& sum);

// 用于代替回調(diào)函數(shù),測試dll功能
extern "C" MY_SIMPLE_MATH_API void Sum(int a, int b, int& sum);

// 用于測試dll加載情況
extern "C" MY_SIMPLE_MATH_API int Test();

6)點(diǎn)擊dllmain.cpp,在里面編寫相關(guān)程序

wKgaomTn_uKAG431AAF4xLKu-gA375.png
CallbackFunction g_Callback = nullptr;

// 用于注冊(cè)回調(diào)函數(shù)的函數(shù)
extern "C" __declspec(dllexport) void RegisterCallback(CallbackFunction callback)
{
	g_Callback = callback;
}

// 用于觸發(fā)回調(diào)函數(shù)的執(zhí)行
extern "C" __declspec(dllexport) void TriggerCallback(int a, int b, int& sum)
{
	if (g_Callback)
	{
		g_Callback(a, b, sum);

	}
}

extern "C" __declspec(dllexport) void Sum(int a, int b, int& sum)
{
	sum = a + b;
}

extern "C" __declspec(dllexport) int Initialize() {
	return 1;
}

7)選擇x86平臺(tái),之后在項(xiàng)目上右鍵,選擇生成或重新生成

wKgaomTn_t-ABDLnAADTRDREW4c050.pngwKgaomTn_t2AAivDAABdtbedfk8428.png

生成的文件路徑

wKgaomTn_t-AV6veAABnHDYl1x4795.png

8)可在文件資源管理器中打開文件,進(jìn)入Debug文件夾,可找到生成的文件。

wKgZomTn_t6AHBYUAAATTgn4HaU480.pngwKgZomTn_t6AdkbEAAAxa6H9Je8428.png

2 測試Dll

1)新建項(xiàng)目

wKgZomTn_t-AQP52AADS0-wXhCc176.png

2)選擇C++的控制臺(tái)

wKgZomTn_uKALdROAAEkYTH5jxs970.png

2)填寫項(xiàng)目名稱,選擇創(chuàng)建

wKgaomTn_t-Afj4kAABDhgOkbXs784.png

3)將之前生成的dll和頭文件放在測試工程的文件夾下

wKgZomTn_t-AGScYAABI3wO1ke8969.png

4)在工程中添加cpp文件

wKgaomTn_t-AWnu9AADX4XAeCQE532.png

wKgZomTn_t-AM4kzAAAnWhPWqpw984.png

5)在文件中編程

#include 
#include 
#include "MyCallbacks.h"

// 定義回調(diào)函數(shù)的簽名
typedef void (*CallbackFunction)(int a, int b, int& sum);

int main() {
	int a = 3, b = 4, result = 0;

	HMODULE dllHandle = LoadLibraryW(L"MyCallbacks.dll"); // 使用 LoadLibraryW,并使用 L前綴
		if (dllHandle) {
			// 獲取函數(shù)指針
			auto registerCallback = reinterpret_cast(GetProcAddress(dllHandle, "RegisterCallback"));
			auto triggerCallback = reinterpret_cast(GetProcAddress(dllHandle, "TriggerCallback"));

			if (registerCallback && triggerCallback) {
				// 注冊(cè)回調(diào)函數(shù)
				registerCallback([](int a, int b, int& sum) {
					sum = a + b;
					});

				// 觸發(fā)回調(diào)
				triggerCallback(a, b, result);

				std::cout 

6)將工程設(shè)置為啟動(dòng)項(xiàng)目

wKgaomTn_t-Adi8tAACEs7QZH70902.png

7)點(diǎn)擊調(diào)試運(yùn)行

chaijie_default.pngwKgaomTn_t-AX8ziAAAnWhPWqpw583.png

8)測試運(yùn)行正常

wKgZomTn_uCAEwlSAABSee77oCQ755.png

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • dll
    dll
    +關(guān)注

    關(guān)注

    0

    文章

    116

    瀏覽量

    46090
  • C++
    C++
    +關(guān)注

    關(guān)注

    22

    文章

    2117

    瀏覽量

    74818
  • Visual
    +關(guān)注

    關(guān)注

    0

    文章

    255

    瀏覽量

    34686
  • 回調(diào)函數(shù)
    +關(guān)注

    關(guān)注

    0

    文章

    88

    瀏覽量

    11830
收藏 1人收藏
  • FindinYang1

評(píng)論

相關(guān)推薦
熱點(diǎn)推薦

一文詳解C語言函數(shù)指針與調(diào)函數(shù)

在講調(diào)函數(shù)之前,我們需要了解函數(shù)指針。
發(fā)表于 10-19 09:34 ?952次閱讀

C語言里面的函數(shù)指針和調(diào)函數(shù)

在講調(diào)函數(shù)之前,我們需要了解函數(shù)指針。
發(fā)表于 12-13 10:28 ?787次閱讀

調(diào)函數(shù)

C++內(nèi)編寫的DLL中有很多事件都是通過調(diào)函數(shù)來反饋,LABVIEW如何可以調(diào)用呢?
發(fā)表于 11-06 15:36

labview怎么處理dll中的調(diào)函數(shù)輸出值

;FS_xxx > 0") is signaled. Parameters[in] flashStatus The flash status C語言中調(diào)函數(shù)一和二,直接打印輸出voi
發(fā)表于 02-19 10:21

C/C++調(diào)函數(shù)

C/C++調(diào)函數(shù)首先看一下調(diào)
發(fā)表于 02-11 15:25

C語言調(diào)函數(shù)學(xué)習(xí)

對(duì)指針的應(yīng)用是C語言編程的精髓所在,而回調(diào)函數(shù)就是C語言里面對(duì)函數(shù)指針的高級(jí)應(yīng)用。簡而言之,
發(fā)表于 05-27 09:44 ?7289次閱讀

C語言函數(shù)調(diào)函數(shù)

來源:嵌入式客棧 1 什么是調(diào)函數(shù)?首先什么是調(diào)呢? 我的理解是:把一段可執(zhí)行的代碼像參數(shù)傳遞那樣傳給其他代碼,而這段代碼會(huì)在某個(gè)時(shí)刻被
的頭像 發(fā)表于 09-11 09:57 ?4372次閱讀

STM32編程時(shí),如何確定中斷調(diào)函數(shù)的入口

問題有個(gè)通用的解法。下面以ADC1為例,來查找它的中斷調(diào)函數(shù)。首先打開CubeMX生成的代碼,找到所有中斷函數(shù)入口的
發(fā)表于 11-23 18:06 ?13次下載
STM32編程時(shí),如何確定中斷<b class='flag-5'>回</b><b class='flag-5'>調(diào)</b><b class='flag-5'>函數(shù)</b>的入口

詳解調(diào)函數(shù)的概念及使用步驟

調(diào)函數(shù)就是一個(gè)被作為參數(shù)傳遞的函數(shù)。在C語言中,調(diào)
的頭像 發(fā)表于 05-26 15:20 ?4338次閱讀

介紹在C++中實(shí)現(xiàn)調(diào)的幾種方法

C++中的一個(gè)重要概念就是類,所以我們一般想讓類的成員函數(shù)作為調(diào)函數(shù)(如果直接用非類的成員函數(shù)
的頭像 發(fā)表于 01-18 15:09 ?4206次閱讀

一文詳解C/C++調(diào)函數(shù)

首先看一下調(diào)函數(shù)的官方解釋:調(diào)函數(shù)就是一個(gè)通過函數(shù)
的頭像 發(fā)表于 02-12 09:20 ?1887次閱讀

C語言技巧之調(diào)函數(shù)

在講調(diào)函數(shù)之前,我們需要了解函數(shù)指針。
的頭像 發(fā)表于 04-18 11:50 ?1025次閱讀

C語言|調(diào)函數(shù)的不同用法

調(diào)函數(shù)是個(gè)高級(jí)操作技巧,也是日常項(xiàng)目中常常使用到的技能。之所以說調(diào)函數(shù)是個(gè)高級(jí)操作技巧,是因
發(fā)表于 07-10 10:34 ?1504次閱讀

調(diào)函數(shù)(callback)是什么?調(diào)函數(shù)的實(shí)現(xiàn)方法

調(diào)函數(shù)是一種特殊的函數(shù),它作為參數(shù)傳遞給另一個(gè)函數(shù),并在被調(diào)用函數(shù)執(zhí)行完畢后被調(diào)用。
發(fā)表于 03-12 11:46 ?3825次閱讀

為什么不需要給調(diào)函數(shù)傳遞參數(shù)

調(diào)函數(shù)C語言里面一個(gè)重要機(jī)制。
的頭像 發(fā)表于 04-15 10:11 ?235次閱讀

電子發(fā)燒友

中國電子工程師最喜歡的網(wǎng)站

  • 2931785位工程師會(huì)員交流學(xué)習(xí)
  • 獲取您個(gè)性化的科技前沿技術(shù)信息
  • 參加活動(dòng)獲取豐厚的禮品