【发布时间】:2021-08-10 00:31:08
【问题描述】:
我正在编写一个 DLL 来为一些模拟软件实现一个控制器,并且我需要一些数据来在模拟过程中对 DLL 的调用中持久化,声明这些持久性数据的最佳实践是什么?我能想到的选项只是使用全局变量(似乎是个坏主意),或者将它们包装在命名空间或类/结构中(更好的主意?),还有更好的选择吗? 我无法更改调用 DLL 的代码中的任何内容,因此无法在此处存储数据。
例如
//option 1
double persistent1 = 0;
int persistent2 = 0;
//option 2
namespace MyDLL
{
double persistent1 = 0;
int persistent2 = 0;
}
//option 3
class MyDLL
{
double persistent1 = 0;
int persistent2 = 0;
};
MyDLL myDll = MyDLL();
void FOO_API __cdecl CALL(double* data)
{
//do something to persistent1 and persistent2 with data.
}
【问题讨论】:
-
将变量放在命名空间中并不意味着它们不是全局的。您显示的命名空间仍然是全局的。命名空间只是避免在编译过程中发生命名冲突,它们并不表示变量在内存中的分配位置。
-
取决于持久数据的数量。对于少量,DLL 可以使用二进制文件或其他一些数据格式(如 JSON)。对于更大量的数据,DLL 可以使用小型数据库或大型数据库。 DLL 还可以在其他地方存储数据,例如,在 Windows 上,DLL 可以使用注册表。
-
“跨电话”是什么意思?您的意思是要在使用您的 DLL 的两个不同进程之间共享这些数据吗?为此,您需要使用共享内存或类似的东西。如果您只想在当前进程中对 DLL 的调用之间操作这些数据,那么 Windows 已经在进程加载 DLL 时提供了附加/分离机制。如果您想在加载的 DLL 之外保留信息,则可以使用注册表/文件。你真的必须澄清你的要求,因为现在很不清楚。
-
无关:我建议简化:
MyDLL myDll = MyDLL();比MyDLL myDll;更好 -
您可以使用古老的技术将数据存储到可执行文件中。在您的可执行文件中,保留适当大小的代码段。在可执行文件中查找此数据段的偏移量;读取和写入此偏移量。请注意,某些操作系统会尝试阻止您修改可执行文件。病毒检查器(和类似的实用程序)将尝试阻止您的代码执行此操作或提醒用户恶意程序(您的)。