在c++ mfc中将flag exe链接到dll

问题描述 投票:0回答:1

我有两个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 项目中。然而,我遇到了以下问题:

  1. 依赖性错误:当尝试从 DLL 内的 EXE 检索标志值时,我面临与依赖性相关的问题。

  2. 链接错误:尝试设置全局变量时,发生链接错误。

您能否建议正确的方法来确保 EXE 和 DLL 之间正确共享和访问该标志,从而避免 Visual Studio 2010 中的这些依赖性和链接错误?

c++ visual-studio-2010 dll mfc exe
1个回答
0
投票

在 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; 
    }();
© www.soinside.com 2019 - 2024. All rights reserved.