我有两个C++项目:一个是可执行文件(EXE),另一个是动态链接库(DLL)。在 EXE 项目中,我使用与复选框相对应的标志,并且我需要从 DLL 项目内访问该标志的值。
为了实现这一目标,我创建了一个头文件,它利用
__declspec(dllexport)
和 __declspec(dllimport)
在 EXE 和 DLL 之间实现正确的符号共享。这是我的定义:
#pragma once
#ifdef BUILDING_DLL
#define SHARED_API __declspec(dllexport)
#else
#define SHARED_API __declspec(dllimport)
#endif
// Declare the shared variable
extern "C" SHARED_API bool g_bEnableBluetoothPortChecking;
// Declare the getter and setter functions
extern "C" SHARED_API bool GetBluetoothPortCheckingState();
extern "C" SHARED_API void SetBluetoothPortCheckingState(bool state);
此标头包含在 EXE 和 DLL 项目中。然而,我遇到了以下问题:
依赖性错误:当尝试从 DLL 内的 EXE 检索标志值时,我面临与依赖性相关的问题。
链接错误:尝试设置全局变量时,发生链接错误。
您能否建议正确的方法来确保 EXE 和 DLL 之间正确共享和访问该标志,从而避免 Visual Studio 2010 中的这些依赖性和链接错误?
在 Windows 上,您无法从可执行文件中导出函数以在 dll 中使用,动态链接器不会让其工作,整个过程甚至不会通过链接器。
正确的方法是从dll中导出函数指针。
typedef void (*set_func_type)(bool);
__declspec(dllexport) set_func_type set_flag = nullptr;
typedef bool (*get_func_type)();
__declspec(dllexport) get_func_type get_flag = nullptr;
然后在您的可执行文件中,您可以将这些函数指针绑定到实际函数。
typedef void (*set_func_type)(bool);
__declspec(dllimport) set_func_type set_flag;
typedef bool (*get_func_type)();
__declspec(dllimport) get_func_type get_flag;
// in main
set_flag = some_function;
get_flag = some_function2;
C++ 具有重要的静态初始化器,因此您可以使用它来初始化 bool 并设置函数指针。
// in your executable static space
bool mybool = []()->bool {
set_flag = +[](bool val) {mybool = val; };
get_flag = +[]()->bool {return mybool; };
return false;
}();