全球最实用的IT互联网信息网站!

AI人工智能P2P分享&下载搜索网页发布信息网站地图

当前位置:诺佳网 > 电子/半导体 > 嵌入式技术 >

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

时间:2023-08-29 16:05

人气:

作者:admin

标签: dll  回调函数  Visual  C++ 

导读:描述了VS环境下,通过C++生成dll的方法,测试回调函数...

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

审核编辑:汤梓红
温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信