2010-11-08 48 views
1

我目前正试图将DLL(FooEmulation)集成到现有项目中。保存DLL的静态内存的单独实例

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

我有原始DLL的源代码,所以我可以将所有的静态全局变量转换为参数(无论是直接还是通过句柄),但是DLL是单独维护的,我希望尽可能避免分叉/合并。

我发现的一种技术是加载多个动态生成的DLL副本,但是这对于我需要的规模而言资源太大。 我也不能为每个Foo创建一个进程或线程。

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

+0

fwiw,这是在Windows上。 – mskfisher 2010-11-08 11:26:49

回答

1

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

+0

我只想加载一次DLL--我真正想要的是当我代表'FooB'和'FooA'调用DLL函数时,换出基础静态数据。 – mskfisher 2010-11-08 20:13:10

+0

@mskfisher:我明白了。你必须重新设计这个库的内部。 – sharptooth 2010-11-09 06:25:37

0

我假设你使用的是Windows,因为没有什么告诉我,否则是..

看看here,这是在Windows中的DLLMain文档。 的DLLMain有告诉你,如果

  • 的处理是否附着(加载你的DLL)
  • 一个进程分离(卸载你的DLL)
  • 一个线程附加参数(加载的每个线程的部分你的DLL)
  • 一个线程分离(卸载DLL的每个线程部分)

如果赶上进程或线程事件和分配(附加)/免费(分离)的新实例你的静态,我认为这会解决你的问题。这是一个有点hacky,但它会工作... 你必须小心你在DLLMain做什么。在文档中查找有关DLLMain中以任何方式阻止的警告。

+0

是的,这是Windows。 – mskfisher 2010-11-08 11:26:25

相关问题