Memory 保留单独的DLL实例';静态存储器

Memory 保留单独的DLL实例';静态存储器,memory,dll,static,global-variables,Memory,Dll,Static,Global Variables,我目前正在尝试将DLL(FooEmulation)集成到现有项目中 DLL假定它一次只用于模拟一个Foo,因此使用了大量静态全局变量。 但是,我希望能够同时管理数千个Foo实例 我有原始DLL的源代码,因此我可以将所有静态全局变量转换为传入的参数(无论是直接传入还是通过句柄传入),但是DLL是单独维护的,如果可能的话,我希望避免分叉/合并 我发现的一种技术是加载动态生成的DLL的多个副本,但这对于我所需要的规模来说资源太多了。 我也负担不起为每个Foo创建进程或线程 是否可以保留DLL静态内存的

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

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

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

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

是否可以保留DLL静态内存的多个副本,并在每次使用DLL时将其还原?

我如何找到它?我甚至可以触摸它吗?

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

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

我假设您在windows上,因为没有任何其他信息告诉我

看看Windows中DLLMain的文档。 DLLMain有一个参数告诉您

  • 正在附加进程(加载DLL)
  • 进程正在分离(卸载DLL)
  • 正在附加线程(加载DLL的每个线程部分)
  • 线程正在分离(卸载DLL的每个线程部分)
如果捕获进程或线程事件并分配(附加)/释放(分离)一个新的静态实例,我认为这将解决您的问题。这有点老套,但会有用的。。。
你在德莱曼也要小心。在文档中查找关于在DLLMain中以任何方式阻止的警告。

我假设您在windows上,因为没有任何其他信息告诉我

看看Windows中DLLMain的文档。 DLLMain有一个参数告诉您

  • 正在附加进程(加载DLL)
  • 进程正在分离(卸载DLL)
  • 正在附加线程(加载DLL的每个线程部分)
  • 线程正在分离(卸载DLL的每个线程部分)
如果捕获进程或线程事件并分配(附加)/释放(分离)一个新的静态实例,我认为这将解决您的问题。这有点老套,但会有用的。。。
你在德莱曼也要小心。在文档中查找关于在DLLMain中以任何方式阻塞的警告。

我只想加载DLL一次-我真正想要的是在我代表
FooB
调用DLL函数时交换底层静态数据,而不是
FooA
@mskfisher:我明白了。为此,您必须重新设计库的内部结构。我只想加载DLL一次-我真正想要的是,当我代表
FooB
vs.
FooA
@mskfisher调用DLL函数时,交换掉底层的静态数据。我明白了。为此,您必须重新设计库的内部结构。