12

我想多次加载相同的dll,例如Lib.dll!

-> 需要为每个 LoadLibrary 创建一个新进程(CreateProcess 函数)!

任何人都有一个例子或一些提示?!

谢谢和问候

4

3 回答 3

23

听起来您希望 DLL 的每个实例都有单独的数据段。这是我能想到这个问题的唯一原因。

实现此目的的唯一方法是确保每次调用LoadLibraryDLL 时都有不同的文件名。每次需要加载 DLL 时,将其复制到临时文件中,确保您使用的名称不同于任何加载的 DLL 实例。

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

于 2012-09-21T15:34:09.903 回答
7

您不能将同一个 DLL 多次加载到单个进程中(或者没有并且有任何影响)。

根据您的评论,DLL 会根据其中一个函数调用执行不同的操作,因此您需要使用“会话”系统,在该系统中为每个函数保留单独的数据集并根据需要(通过另一个调用)创建它们并传递句柄或类似于每个函数调用。这是大多数 Win32 API 的工作方式(文件句柄、窗口句柄、GDI 对象等)

如果您使 DLL 成为 COM 主机并使用 COM 对象,则每个类实例都会自动处理。

如果您想使用一个单独的进程,那么您可以通过启动一个新进程来托管 DLL 并使用多种 IPC 形式之一与其通信来做到这一点。

于 2012-09-21T12:06:03.923 回答
1

您将 DLL 视为对象实例。这根本不是 DLL 的工作方式。DLL 不是对象,它们是一堆代码和资源。无论理论上您可以加载多少次 DLL,这些事情都不会改变。因此,在同一个进程中加载​​ DLL 的多个实例是没有意义的。

这是一个很好的例子,说明了为什么全局变量往往是一个坏主意。数据需要能够根据需要进行实例化。

因此,如果您需要一个对象的多个实例来处理,您应该设计 DLL 来完全做到这一点。正如其他人所说,某种会话,或者只是您可以随时实例化的某个对象。

这是对抽象问题的抽象回答。如果你能解释更多关于这个 DLL 究竟做了什么,以及为什么你需要它的多个实例,那将会有很大帮助。

于 2012-09-21T16:24:42.427 回答