0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C++生成Dll与回调函数测试

lvxisi 来源:lvxisi 作者:lvxisi 2023-08-29 16:05 次阅读

1 生成DLL文件

1)打开VisualStudio,选择创建新项目。

wKgZomTn_uCAZa2KAAEGKAnMq_M932.png

2)选择c++的动态链接库

wKgaomTn_uKAI-BPAAEW2lDsSQM352.png

3)编写项目名称,对应生成dll的名称,此处命名为MyCallbacks

wKgZomTn_t2ALokBAABYAMkVdSQ299.png

4)右侧资源管理器,在头文件位置,添加新建项。

wKgZomTn_t-AOXmFAACkgMLZJQA567.pngwKgZomTn_t6AHBYUAAATTgn4HaU480.png

5)编写相关头文件

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

// 定义回调函数的签名
typedef void (*CallbackFunction)(int a, int b, int& sum);

// 用于注册回调函数的函数声明
extern "C" MY_SIMPLE_MATH_API void RegisterCallback(CallbackFunction callback);

// 用于触发回调函数的执行的函数声明
extern "C" MY_SIMPLE_MATH_API void TriggerCallback(int a, int b, int& sum);

// 用于代替回调函数,测试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)点击dllmain.cpp,在里面编写相关程序

wKgaomTn_uKAG431AAF4xLKu-gA375.png
CallbackFunction g_Callback = nullptr;

// 用于注册回调函数的函数
extern "C" __declspec(dllexport) void RegisterCallback(CallbackFunction callback)
{
	g_Callback = callback;
}

// 用于触发回调函数的执行
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平台,之后在项目上右键,选择生成或重新生成

wKgaomTn_t-ABDLnAADTRDREW4c050.pngwKgaomTn_t2AAivDAABdtbedfk8428.png

生成的文件路径

wKgaomTn_t-AV6veAABnHDYl1x4795.png

8)可在文件资源管理器中打开文件,进入Debug文件夹,可找到生成的文件。

wKgZomTn_t6AHBYUAAATTgn4HaU480.pngwKgZomTn_t6AdkbEAAAxa6H9Je8428.png

2 测试Dll

1)新建项目

wKgZomTn_t-AQP52AADS0-wXhCc176.png

2)选择C++的控制台

wKgZomTn_uKALdROAAEkYTH5jxs970.png

2)填写项目名称,选择创建

wKgaomTn_t-Afj4kAABDhgOkbXs784.png

3)将之前生成的dll和头文件放在测试工程的文件夹下

wKgZomTn_t-AGScYAABI3wO1ke8969.png

4)在工程中添加cpp文件

wKgaomTn_t-AWnu9AADX4XAeCQE532.png

wKgZomTn_t-AM4kzAAAnWhPWqpw984.png

5)在文件中编程

#include < iostream >
#include < Windows.h >
#include "MyCallbacks.h"

// 定义回调函数的签名
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) {
			// 获取函数指针
			auto registerCallback = reinterpret_cast< void
			(*)(CallbackFunction) >(GetProcAddress(dllHandle, "RegisterCallback"));
			auto triggerCallback = reinterpret_cast< void (*)(int, int,
				int&) >(GetProcAddress(dllHandle, "TriggerCallback"));

			if (registerCallback && triggerCallback) {
				// 注册回调函数
				registerCallback([](int a, int b, int& sum) {
					sum = a + b;
					});

				// 触发回调
				triggerCallback(a, b, result);

				std::cout < < "Result after callback: " < < result < < std::endl;
			}

			FreeLibrary(dllHandle);
		}

	return 0;
}

6)将工程设置为启动项目

wKgaomTn_t-Adi8tAACEs7QZH70902.png

7)点击调试运行

chaijie_default.pngwKgaomTn_t-AX8ziAAAnWhPWqpw583.png

8)测试运行正常

wKgZomTn_uCAEwlSAABSee77oCQ755.png

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • dll
    dll
    +关注

    关注

    0

    文章

    115

    浏览量

    45376
  • C++
    C++
    +关注

    关注

    22

    文章

    2104

    浏览量

    73484
  • Visual
    +关注

    关注

    0

    文章

    252

    浏览量

    34219
  • 回调函数
    +关注

    关注

    0

    文章

    87

    浏览量

    11543
收藏 人收藏

    评论

    相关推荐

    一文详解C语言函数指针与函数

    在讲函数之前,我们需要了解函数指针。
    发表于 10-19 09:34 775次阅读

    C语言里面的函数指针和函数

    在讲函数之前,我们需要了解函数指针。
    发表于 12-13 10:28 585次阅读

    函数

    C++内编写的DLL中有很多事件都是通过函数来反馈,LABVIEW如何可以调用呢?
    发表于 11-06 15:36

    labview怎么处理dll中的函数输出值

    ;FS_xxx > 0") is signaled. Parameters[in] flashStatus The flash status C语言中函数一和二,直接打印输出voi
    发表于 02-19 10:21

    C/C++函数

    C/C++函数首先看一下
    发表于 02-11 15:25

    C语言函数学习

    对指针的应用是C语言编程的精髓所在,而回函数就是C语言里面对函数指针的高级应用。简而言之,
    发表于 05-27 09:44 7194次阅读

    函数的详细资料说明

    异步事件的处理,首先将异步事件发生时需要执行的代码编写成一个函数,并将该函数注册成为函数,这样当该异步事件发生时,系统会自动调用事先注册
    发表于 02-28 08:00 6次下载
    <b class='flag-5'>回</b><b class='flag-5'>调</b><b class='flag-5'>函数</b>的详细资料说明

    C语言函数函数

    来源:嵌入式客栈 1 什么是函数?首先什么是呢? 我的理解是:把一段可执行的代码像参数传递那样传给其他代码,而这段代码会在某个时刻被
    的头像 发表于 09-11 09:57 4098次阅读

    STM32编程时,如何确定中断函数的入口

    问题有个通用的解法。下面以ADC1为例,来查找它的中断函数。首先打开CubeMX生成的代码,找到所有中断函数入口的
    发表于 11-23 18:06 13次下载
    STM32编程时,如何确定中断<b class='flag-5'>回</b><b class='flag-5'>调</b><b class='flag-5'>函数</b>的入口

    详解函数的概念及使用步骤

    函数就是一个被作为参数传递的函数。在C语言中,
    的头像 发表于 05-26 15:20 3974次阅读

    介绍在C++中实现的几种方法

    C++中的一个重要概念就是类,所以我们一般想让类的成员函数作为函数(如果直接用非类的成员函数
    的头像 发表于 01-18 15:09 3540次阅读

    一文详解C/C++函数

    首先看一下函数的官方解释:函数就是一个通过函数
    的头像 发表于 02-12 09:20 1508次阅读

    C语言技巧之函数

    在讲函数之前,我们需要了解函数指针。
    的头像 发表于 04-18 11:50 741次阅读

    C语言|函数的不同用法

    函数是个高级操作技巧,也是日常项目中常常使用到的技能。之所以说函数是个高级操作技巧,是因
    发表于 07-10 10:34 1258次阅读

    函数(callback)是什么?函数的实现方法

    函数是一种特殊的函数,它作为参数传递给另一个函数,并在被调用函数执行完毕后被调用。
    发表于 03-12 11:46 2706次阅读