多次加载同一个dll

15
我想多次加载同一个dll,例如Lib.dll!
-> 需要为每个LoadLibrary创建一个新进程(CreateProcess函数)!
有人有示例或一些提示吗?!
谢谢并问候。

1
为什么要多次加载同一个 DLL? - Frerich Raabe
为什么你想要多次加载它?在同一个进程中无法多次加载。您可以创建多个进程,在“逻辑上”,每个进程将被加载一次。请注意,在“物理”意义上,操作系统可能仍会加载一次,并在所有进程中重用相同的内存(当然,只有只读部分,如代码和静态不可变数据,任何可变部分必须是进程特定的)。 - Analog File
@AnalogFile 我知道。这就是为什么我写了如何使用CreateProcess(多个进程)来实现这一点! - leon22
https://dev59.com/3XA75IYBdhLWcg3wDUi2 - Bachor
2
我不是原帖作者,但我有一个合法的、虽然有些复杂的业务案例。第三方算法库是单线程的,将所有内容存储在全局状态中。我想在多个线程上运行它的几个实例。重写以使用非全局状态是昂贵的。因此,需要多个具有独立全局状态的实例。 - Seva Alekseyev
显示剩余3条评论
3个回答

28

听起来你想让每个DLL实例拥有独立的数据段。这是我能想到的唯一原因。

唯一的方法是确保每次调用LoadLibrary时,DLL都有不同的文件名。每次需要加载它时,将DLL复制到临时文件中,确保使用的名称与已加载的DLL实例不同。

我赞同上面的评论,鼓励你重新设计系统架构。


9
您不能将同一DLL加载到单个进程中多次(或者这样做没有任何效果)。
根据您的评论,DLL根据其中一个函数调用执行不同的操作,因此您需要使用“会话”系统,在其中为每个会话保留单独的数据集,并根据需要创建它们(通过另一个调用),并传递一个句柄或类似的东西给每个函数调用。这是大多数Win32 API的工作方式(文件句柄、窗口句柄、GDI对象等)。
如果您将DLL设置为COM主机并使用COM对象,则每个类实例都会自动处理此问题。
如果您想要使用单独的进程,则可以通过启动新进程来托管DLL,并使用许多形式的IPC与其通信。

5
只要文件名不同,你可以在单个进程中多次加载同一DLL,并且不会产生任何影响。原文:"You can not load the same DLL multiple times into a single process (or not and have any effect)." Actually you can so long as the filenames differ. - David Heffernan

1

您正在将 DLL 视为对象实例进行处理。这完全不是 DLL 的工作方式。DLL 不是对象,它们是一堆代码和资源。无论您理论上加载 DLL 多少次,这些东西都不会改变。因此,在同一进程中加载多个 DLL 实例没有任何意义。

这是全局变量往往不是一个好主意的一个很好的例子。数据需要能够根据需要进行实例化。

因此,如果您需要使用多个对象实例进行工作,则应设计 DLL 来实现这一点。正如其他人所说,可以使用某种会话或只是可以在需要时实例化的对象。

这是对抽象问题的抽象回答。如果您能更详细地解释这个 DLL 究竟是做什么的,以及为什么需要多个实例,那将非常有帮助。


10
这不是一个不称职的反对全局变量的地方。具体问题是,多次调用LoadLibrary是否会加载DLL中的多个资源副本,还是只有一个副本。 - Jo So

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接