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文章
113浏览量
45016 -
C++
+关注
关注
21文章
2066浏览量
72900 -
Visual
+关注
关注
0文章
252浏览量
34012 -
回调函数
+关注
关注
0文章
87浏览量
11455
发布评论请先 登录
相关推荐
请问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
回调函数的配置方法
目录一、MX配置二、软件生成的关键代码三、用户代码附:回调函数的配置方法一、MX配置1.设置LSE2.配置RTC- 激活时钟源-激活日历-配置2020年2月3日09:40:0 (HAL
发表于 08-16 07:16
评论