C++生成Dll与回调函数测试

电子说

1.2w人已加入

描述

1 生成DLL文件

1)打开Visual Studio,选择创建新项目。

dll

2)选择c++的动态链接库

dll

3)编写项目名称,对应生成dll的名称,此处命名为MyCallbacks

dll

4)右侧资源管理器,在头文件位置,添加新建项。

dlldll

5)编写相关头文件

dll
#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,在里面编写相关程序

dll
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平台,之后在项目上右键,选择生成或重新生成

dlldll

生成的文件路径

dll

8)可在文件资源管理器中打开文件,进入Debug文件夹,可找到生成的文件。

dlldll

2 测试Dll

1)新建项目

dll

2)选择C++的控制台

dll

2)填写项目名称,选择创建

dll

3)将之前生成的dll和头文件放在测试工程的文件夹下

dll

4)在工程中添加cpp文件

dll

 

dll

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)将工程设置为启动项目

dll

7)点击调试运行

dlldll

8)测试运行正常

dll

  审核编辑:汤梓红
 
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分