1 生成DLL文件
1)打开VisualStudio,选择创建新项目。
2)选择c++的动态链接库
3)编写项目名称,对应生成dll的名称,此处命名为MyCallbacks
4)右侧资源管理器,在头文件位置,添加新建项。
5)编写相关头文件
#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,在里面编写相关程序
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平台,之后在项目上右键,选择生成或重新生成
生成的文件路径
8)可在文件资源管理器中打开文件,进入Debug文件夹,可找到生成的文件。
2 测试Dll
1)新建项目
2)选择C++的控制台
2)填写项目名称,选择创建
3)将之前生成的dll和头文件放在测试工程的文件夹下
4)在工程中添加cpp文件
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)将工程设置为启动项目
7)点击调试运行
8)测试运行正常
审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
dll
+关注
关注
0文章
115浏览量
45376 -
C++
+关注
关注
22文章
2104浏览量
73484 -
Visual
+关注
关注
0文章
252浏览量
34219 -
回调函数
+关注
关注
0文章
87浏览量
11543
发布评论请先 登录
相关推荐
labview怎么处理dll中的回调函数输出值
;FS_xxx > 0") is signaled. Parameters[in] flashStatus The flash status C语言中回调函数一和二,直接打印输出voi
发表于 02-19 10:21
回调函数的详细资料说明
异步事件的处理,首先将异步事件发生时需要执行的代码编写成一个函数,并将该函数注册成为回调函数,这样当该异步事件发生时,系统会自动调用事先注册
发表于 02-28 08:00
•6次下载
C语言函数的回调函数
来源:嵌入式客栈 1 什么是回调函数?首先什么是回调呢? 我的理解是:把一段可执行的代码像参数传递那样传给其他代码,而这段代码会在某个时刻被
STM32编程时,如何确定中断回调函数的入口
问题有个通用的解法。下面以ADC1为例,来查找它的中断回调函数。首先打开CubeMX生成的代码,找到所有中断函数入口的
发表于 11-23 18:06
•13次下载
评论