DLL与EXE之间的通讯调用 以及 回调函数的线程执行空间

DLL与EXE通讯调用:回调函数的线程执行分析
这篇博客介绍了DLL与EXE之间如何通过回调函数进行通讯,展示了简单的实现方式,强调回调函数的执行线程取决于调用者。文章通过示例代码说明DLL的导出函数如何接收并调用EXE提供的回调,以及在多线程环境下的线程执行空间问题。

  dll 与 exe 之间的通讯方式有很多种, 本文采用回调函数的方法实现, 本文也将研究多线程,多模块的情况下,回调函数所在的线程, 啥也不说了,先附上代码:

 

下面的是dll模块的的, dll的工程文件:

提供的引用内容未提及在VC++调用线程DLL并在多线程调用回调函数的相关信息,不过可以给出一般性的实现步骤和示例代码。 ### 实现步骤 1. **创建多线程DLL**:在DLL中实现多线程逻辑,并且支持回调函数的注册和调用。 2. **定义回调函数类型**:在DLL调用程序中都要定义相同的回调函数类型。 3. **在DLL中注册回调函数**:调用程序将回调函数的指针递给DLL。 4. **在多线程调用回调函数**:DLL中的线程在合适的时机调用回调函数。 ### 示例代码 #### DLL代码(`MultiThreadDLL.cpp`) ```cpp #include <windows.h> #include <iostream> // 定义回调函数类型 typedef void (__stdcall *CallbackFunction)(int); // 全局回调函数指针 CallbackFunction g_Callback = nullptr; // 线程函数 DWORD WINAPI ThreadFunction(LPVOID lpParam) { for (int i = 0; i < 5; ++i) { if (g_Callback) { g_Callback(i); } Sleep(1000); } return 0; } // 导出函数,用于设置回调函数 extern "C" __declspec(dllexport) void SetCallback(CallbackFunction callback) { g_Callback = callback; } // 导出函数,用于启动线程 extern "C" __declspec(dllexport) void StartThread() { CreateThread(NULL, 0, ThreadFunction, NULL, 0, NULL); } ``` #### 调用程序代码(`main.cpp`) ```cpp #include <windows.h> #include <iostream> // 定义回调函数类型 typedef void (__stdcall *CallbackFunction)(int); // 导出函数类型 typedef void (__stdcall *SetCallbackFunc)(CallbackFunction); typedef void (__stdcall *StartThreadFunc)(); // 回调函数实现 void __stdcall MyCallback(int value) { std::cout << "Callback called with value: " << value << std::endl; } int main() { // 加载DLL HMODULE hModule = LoadLibrary(L"MultiThreadDLL.dll"); if (hModule == NULL) { std::cout << "Failed to load DLL." << std::endl; return 1; } // 获取导出函数地址 SetCallbackFunc setCallback = (SetCallbackFunc)GetProcAddress(hModule, "SetCallback"); StartThreadFunc startThread = (StartThreadFunc)GetProcAddress(hModule, "StartThread"); if (setCallback && startThread) { // 设置回调函数 setCallback(MyCallback); // 启动线程 startThread(); // 等待一段时间 Sleep(6000); } // 卸载DLL FreeLibrary(hModule); return 0; } ``` ### 代码解释 - **DLL代码**:定义了回调函数类型`CallbackFunction`,并在`ThreadFunction`线程函数中调用回调函数。`SetCallback`函数用于设置回调函数,`StartThread`函数用于启动线程。 - **调用程序代码**:加载DLL,获取导出函数地址,设置回调函数并启动线程。在`MyCallback`函数中实现回调逻辑。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值