保持DLL的静态内存的单独实例

时间:2010-11-08 10:46:44

标签: memory dll static global-variables

我目前正在尝试将DLL(FooEmulation)集成到现有项目中。

DLL假定它一次只用于模拟一个Foo,并因此使用大量静态全局变量。
但是,我希望能够一次管理数千个Foo个实例。

我有原始DLL的源代码,因此我可以将所有静态全局变换为传入的参数(无论是直接还是通过句柄),但DLL是单独维护的,我想如果可能的话,避免分叉/合并。

我发现的一种技术是加载DLL的多个动态生成的副本,但这对于我需要的扩展来说太耗资源了。 我也无法为每个Foo创建一个流程或线程。

是否可以保留DLL的静态内存的多个副本并在每次使用DLL时恢复它? 我如何找到它?我甚至可以接触它吗?

2 个答案:

答案 0 :(得分:1)

当您将DLL多次加载到同一进程中时,所有静态数据都是共享的,句点。您必须重新设计库,以便在运行时根据需要动态创建所有这些对象。

答案 1 :(得分:0)

我假设你在窗户上,因为没有什么可以告诉我的。

看看here, 这是Windows中DLLMain的文档。 DLLMain有一个参数,告诉你是否

  • 正在附加一个进程(加载您的DLL)
  • 进程正在分离(卸载DLL)
  • 正在附加一个线程(加载DLL的每个线程部分)
  • 一个线程正在分离(卸载DLL的每个线程部分)

如果您捕获进程或线程事件并分配(附加)/释放(分离)静态的新实例,我认为这将解决您的问题。这有点hacky,但它会工作...... 你必须要小心你在DLLMain中所做的事情。在文档中查看有关DLLMain中以任何方式阻止的警告。