C++使用dll的回调函数

回调函数和动态库

在编写代码时,使用动态库可以提高代码项目的可维护性。但在使用动态库时存在需要对使用外部函数作为输入的时候,此时需要使用回调函数进行回调,完成代码的具体功能。

  1. 生成动态链接库
  2. 使用回调函数完成链接库

1. 生成动态链接库

由于C++编译后函数名会发生变化,所以建议将C++封装成C的接口形式。使用extern "C"将接口封装成C语言的形式。

#ifdef __cplusplus
extern "C" {
#endif
	__declspec(dllexport) int dll_add(int a, int b);	// 简单的加法,和不同的昂发一样,不做实现
#ifdef __cplusplus
}
#endif

其中__declspec(dllexport)表示将它的所有成员函数和静态数据成员都导出。但dll仅在Windows下才能使用,所以建议头文件添加代码

#ifdef __linux__  //Linux platform
#define ADD	extern
#elif  _WIN64
// #ifdef ALG_WINDOWS        //Windows platform
#ifndef ADD 
#define ADD    __declspec(dllexport)
#else
#define ADD    __declspec(dllimport)
#endif // !__JNAINTERFACE__
// #endif
#endif

// 后续可以使用ADD表示__declspec(dllexport)

该声明可以再Linux中生成.so文件,在Windows中生成.dll文件。

将代码完成后,生成动态库。在Linux下生成动态库的方法参考博客。 Windows下可以使用Visual Studio生成。

在这里插入图片描述

2. 使用回调函数完成链接库

使用回调函数可以使用函数指针完成,也可以使用functional库完成。

首先构建动态链接库

#include<functional>

#ifdef __linux__  //Linux platform
#define ADD	extern
#elif  _WIN64
// #ifdef ALG_WINDOWS        //Windows platform
#ifndef ADD 
#define ADD    __declspec(dllexport)
#else
#define ADD    __declspec(dllimport)
#endif // !__JNAINTERFACE__
// #endif
#endif

typedef function<int(int, int )> Fun;

#ifdef __cplusplus
extern "C" {
#endif
	ADD int dll_add(Fun fun, int a, int b);
#ifdef __cplusplus
}
#endif

调用dll需要引入.h文件、.lib文件和.dll文件,其中.dll文件需要放在当前运行的目录下。

#include<functional>

int add(int a, int b)
{
    return a + b;
}

int main()
{
    std::function<int(int, int )> f = std::bind(add, std::placeholders_1, placeholders_2);
    auto res = dll_add(f, 1, 2);
}

当然调用的文件可能是类的成员函数,所以需要将其修改为

#include<functional>

class Add
{
public:
	int add(int a, int b);
};

int Add::add(int a, int b)
{
	return a + b;
}

int main()
{
    Add test;
    std::function<int(int, int )> f = std::bind(&Add::add, &test, std::placeholders::_1, placeholders::_2);	// std::placeholders表示未知的输入参数
    auto res = dll_add(f, 1, 2);
}

参考博客

动态链接库的优缺点

回调函数(callback)是什么?

关于C++ 回调函数(callback) 精简且实用

C++/C++11中头文件functional的使用

在 C++ 类中使用 dllimport 和 dllexport

类中使用 dllimport 和 dllexport](https://learn.microsoft.com/zh-cn/cpp/cpp/using-dllimport-and-dllexport-in-cpp-classes?view=msvc-170)

c++11随记:std::bind及 std::placeholders

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DLL回调函数是指在一个动态链接库(DLL)中定义的函数,该函数被用作参数传递给其他函数,并在特定的事件或条件发生时被调用。回调函数允许程序员将自己的代码注入到 DLL 中,并在特定情况下由 DLL 来调用。这样可以实现模块化和可扩展的设计。 在C语言中,可以通过函数指针来实现回调函数。首先,定义一个函数指针类型,然后在需要使用回调函数的地方,将函数指针作为参数传递给其他函数。当特定事件或条件发生时,DLL 可以调用该函数指针所指向的函数。 以下是一个简单的示例,展示了如何在 DLL 中实现回调函数: ```c // 声明回调函数类型 typedef void (*CallbackFunc)(int); // 定义 DLL 中的函数,接受回调函数作为参数 void RegisterCallback(CallbackFunc callback) { // DLL 中的某些操作... // 当事件或条件发生时,调用回调函数 callback(42); } ``` 在使用DLL 的代码中,可以实现具体的回调函数,并将其传递给 `RegisterCallback` 函数: ```c // 实现回调函数 void MyCallback(int value) { printf("Callback received: %d\n", value); } int main() { // 将回调函数作为参数传递给 RegisterCallback 函数 RegisterCallback(MyCallback); // ... return 0; } ``` 当 DLL 中的事件或条件发生时,将会调用 `MyCallback` 函数,并将参数传递给它。 需要注意的是,回调函数的签名(参数和返回值类型)必须与 DLL 中所定义的回调函数类型相匹配,否则会导致编译错误或运行时错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值