2.c++动态链接库实现回调

c++动态链接库实现回调

  1. 创建动态链接库dll

vs新建工程,选择动态链接库(dll);

工程创建后会自动生成dllmain.cpp,以及DllMain函数,是dll的入口函数,具体功能可以百度查看,一般用不到,可以直接将dllmain.cpp删除,或者放着不管。

新建类Handle,代码如下,定义一个HandleCall回调处理函数,用来处理主程序(startcall)传入的参数和回调函数,通过__declspec(dllexport)导出整个Handle类,也可以单独导出某个函数,主程序需要通过__declspec(dllimport)将Handle导入

Handle.h

#pragma once

#include<iostream>

#ifdef HANDLEDLL_EXPORTS

#define DLLEXOPRT __declspec(dllexport)

#else

#define DLLEXOPRT __declspec(dllimport)

#endif // HANDLE_EXPORTS

class DLLEXOPRT Handle

{

public:

Handle();

~Handle();

public:

 void HandleCall(int n, std::string str, void(*callback)(int, std::string));

};

Handle.cpp

#include "pch.h"

#include "Handle.h"

Handle::Handle()

{}

Handle::~Handle()

{}

void Handle::HandleCall(int n, std::string str, void(*callback)(int, std::string))

{

callback(n, str);

};

  1. 创建主程序,调用HandleDll

主程序包含HandleDll的.h、.lib、dll文件。

主程序代码如下:

#include <iostream>

#include "include/Handle.h"

void Callback_1(int x, std::string str) // Callback Function 1

{

    printf("Hello, this is Callback_1: x = %d, str = %s \n", x, str.c_str());

    //return 0;

}

int main()

{

    int a = 2;

    std::string stra = "222";

    Handle hdl;

    hdl.HandleCall(a, stra, Callback_1);

}

运行主程序执行结果如下:

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值