【问题标题】:What is the best way to declare persistent variables in a DLL with C++使用 C++ 在 DLL 中声明持久变量的最佳方法是什么
【发布时间】: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; 更好
  • 您可以使用古老的技术将数据存储到可执行文件中。在您的可执行文件中,保留适当大小的代码段。在可执行文件中查找此数据段的偏移量;读取和写入此偏移量。请注意,某些操作系统会尝试阻止您修改可执行文件。病毒检查器(和类似的实用程序)将尝试阻止您的代码执行此操作或提醒用户恶意程序(您的)。

标签: c++ dll


【解决方案1】:

显然,选项 1 不好。

选项 2 也好不了多少。

如果您提供 getter 和 setter,选项 3 可以让您更好地控制数据的完整性。它们可以合并锁定以同步来自多个线程的访问。

选项 4 - 实现一个单例,这样您就不会意外创建多个 MyDLL 实例

【讨论】:

  • 感谢您的帮助,单例模式可能是可行的,似乎是一堆糟糕的选择中最好的
猜你喜欢
  • 2016-05-19
  • 2011-12-01
  • 2016-09-18
  • 2016-06-03
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多