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

    文章

    113

    浏览量

    45016
  • C++
    C++
    +关注

    关注

    21

    文章

    2066

    浏览量

    72900
  • Visual
    +关注

    关注

    0

    文章

    252

    浏览量

    34012
  • 回调函数
    +关注

    关注

    0

    文章

    87

    浏览量

    11455
收藏 人收藏

    评论

    相关推荐

    labview调用DLL函数原型中有函数这个改怎么办?

    labview调用DLL函数原型中有函数这个改怎么办?
    发表于 08-05 15:23

    有没有人知道怎么将c#中的函数二次封装成DLL,以便labview调用

    有没有人知道怎么将c#中的函数二次封装成DLL,工labview调用
    发表于 03-18 20:42

    函数

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

    labview如何调用dll里面的函数呀?想学习下,谢谢

    labview如何调用dll里面的函数呀?想学习下,谢谢
    发表于 12-06 09:04

    函数小结

    调用对应的函数)的这个过程就是函数回调过程,被函数称为
    发表于 07-05 01:51

    请问stm2cubemx生成的u*** device大容量存储函数如何使用

    请问各位,stm2cubemx生成的u*** device大容量存储软件,u***的connect和disconnect函数已经被重新定义,但是里面没有预留用户代码区,请问如何使用
    发表于 11-26 08:36

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

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

    C 语言函数详解

    C 语言函数详解什么是函数
    发表于 04-08 10:36

    C语言函数是什么

    什么是函数?为什么要使用回函数?怎么使用回函数
    发表于 12-28 07:11

    函数的配置方法

    目录一、MX配置二、软件生成的关键代码三、用户代码附:函数的配置方法一、MX配置1.设置LSE2.配置RTC- 激活时钟源-激活日历-配置2020年2月3日09:40:0 (HAL
    发表于 08-16 07:16

    函数的作用是什么?怎么使用回函数

    什么是js函数函数的作用是什么?怎么使用回
    发表于 11-01 06:10

    c语言函数的作用是什么,怎么使用

    大家好,我是无际。今天给大家讲一下芯片/模块厂家写SDK必须会使用的一种技术:函数函数
    发表于 11-30 06:09

    如何确定中断函数函数

    问题有个通用的解法。下面以ADC1为例,来查找它的中断函数。首先打开CubeMX生成的代码,找到所有中断函数入口的
    发表于 12-06 06:21

    函数在程序开发中有何作用呢

    函数在程序开发中是一个非常重要的概念,所谓的其实就是不同程序模块之间的接口和约定,是软件分层设计的基本方式。拓展:
    发表于 03-01 07:13

    C/C++函数

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