gpt4 book ai didi

c++ - 具有来自同一个 DLL 的全局变量的多个实例

转载 作者:可可西里 更新时间:2023-11-01 11:38:32 25 4
gpt4 key购买 nike

目前,我有一个具有以下简化 View 的系统。

The entire system run under single process
------------------------------------------
--- DLL0.DLL --- COMMON.DLL (contains global_variable in COMMON.DLL)
EXE ---|
--- DLL1.DLL --- COMMON.DLL (contains global_variable in COMMON.DLL)

COMMON.DLL源码如下。

// COMMON.DLL
#ifdef COMMON_EXPORTS
_declspec( dllexport ) int global_variable = 100;
// Function used to access and print global_variable.
__declspec(dllexport) void common_fun_which_access_global_variable();
#else
_declspec(dllimport) int global_variable;
__declspec(dllimport) void common_fun_which_access_global_variable();
#endif

DLL0.DLL的源码如下。

__declspec(dllexport)
void DLL0() {
printf ("This is DLL0\n");
printf ("In DLL0, global_variable is %i\n", global_variable);
common_fun_which_access_global_variable();
global_variable = 200;
printf ("DLL0 is now setting global_variable to 200\n");
common_fun_which_access_global_variable();
}

DLL1.DLL的源码如下。

__declspec(dllexport)
void DLL1() {
printf ("This is DLL1\n");
printf ("In DLL1, global_variable is %i\n", global_variable);
common_fun_which_access_global_variable();
global_variable = 400;
printf ("DLL1 is now setting global_variable to 400\n");
common_fun_which_access_global_variable();
}

EXE源码如下。

HINSTANCE instance0 = AfxLoadLibrary(_T("DLL0.dll"));
FARPROC fun0 = GetProcAddress(instance0, "DLL0");
HINSTANCE instance1 = AfxLoadLibrary(_T("DLL1.dll"));
FARPROC fun1 = GetProcAddress(instance1, "DLL1");
_fun0();
_fun1();

输出如下。

This is DLL0
In DLL0, global_variable is 100
In COMMON, global_varialbe is 100
DLL0 is now setting global_variable to 200
In COMMON, global_varialbe is 200

This is DLL1
In DLL1, global_variable is 200 <-- I wish 100 is being printed.
In COMMON, global_varialbe is 200 <-- I wish 100 is being printed here too.
<-- I wish DLL0 and DLL1 have their own instance of
<-- global_variable respectively.
DLL1 is now setting global_variable to 400
In COMMON, global_varialbe is 400

整个系统在一个进程中执行。虽然 DLL0.DLLDLL1.DLL 都被显式加载,但依赖项 COMMON.DLL 只会被加载一次 在整个应用程序生命周期中。 EXE 不会加载相同的 COMMON.DLL 两次。

有什么办法,我可以在不违反其中一条规则的情况下实现以下目标?

  1. DLL0 和 DLL1 可以有自己的 global_variable 实例吗?
  2. global_variable必须是全局的,并且重新放在COMMON.DLL里面?
  3. COMMON.DLL 将使用 LIB 文件通过隐式链接加载。
  4. 不要将 COMMON.DLL 重命名为 COMMON-DLL0.DLLCOMMON-DLL1.DLL
  5. 没有静态链接。
  6. 如果 DLL0 更改了 global_variable 的值,则从 DLL0 调用 common_fun_which_access_global_variable 应该可以访问 DLL0 的更改值。但是,从 DLL1 调用 common_fun_which_access_global_variable 不应实现更改。

** 我知道这太多了。但我现在正在处理遗留代码。你知道:)

并排组装能解决这类问题吗?我的理解是,side-by-side assembly是用来解决多个同名不同版本的DLL的问题。我不确定它是否适用于我的上述情况?

或者,我应该反过来问吗?我们如何在同一个 EXE 中加载 2 个 COMMON.DLL 实例?

最佳答案

如果我理解正确的话,COMMON.dll 是遗留代码,遗留代码被 DLL0.dll 和 DLL1.dll 使用。

在不知道所有细节的情况下,我会提出以下建议:

1) 在DLL0.dll和DLL1.dll中创建一个全局变量。
2) 使用 COMMON.dll 的 global_variable 值初始化步骤 1 中的每个全局变量。
3) 根据需要使用两个新的global_variables。

关于c++ - 具有来自同一个 DLL 的全局变量的多个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5467199/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com