电子说
1)打开Visual Studio,选择创建新项目。
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文件夹,可找到生成的文件。
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)测试运行正常
全部0条评论
快来发表一下你的评论吧 !