多次加载相同的dll

时间:2012-09-21 11:51:14

标签: c++ winapi dll process loadlibrary

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

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

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

谢谢和问候

3 个答案:

答案 0 :(得分:13)

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

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

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

答案 1 :(得分:6)

您无法多次将同一DLL加载到单个进程中(或不加载任何效果)。

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

如果您将DLL作为COM主机并使用COM对象,那么每个类实例将自动处理它。

如果你想使用一个单独的进程,你就可以通过启动一个新进程来托管DLL并使用多种形式的IPC之一来与之进行通信。

答案 2 :(得分:3)

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

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

因此,如果您需要使用多个对象实例,则应设计DLL以完成该操作。正如其他人所说,某种会话,或者只是你可以随时实例化的一些对象。

这是抽象问题的抽象答案。如果您可以解释更多关于此DLL的确切功能,以及为什么需要它的多个实例,那么这将有所帮助。