c++动态链接库实现回调
- 创建动态链接库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);
};
- 创建主程序,调用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);
}
运行主程序执行结果如下: