【问题标题】:Load the same dll multiple times [closed]多次加载相同的dll [关闭]
【发布时间】:2012-09-13 20:18:40
【问题描述】:

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

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

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

谢谢和问候

【问题讨论】:

  • 为什么要多次加载同一个DLL?
  • 为什么要多次加载它?您不能在同一进程中多次加载它。您可以创建多个进程,并且在“逻辑意义上”,它将为每个进程加载一次。请注意,在“物理”意义上,它可能仍会加载一次,因为操作系统将尝试加载一次并在所有进程中重用相同的内存(当然,只有只读部分,如代码和静态不可变数据,任何可变的东西都必然是特定于过程的)。
  • dll本身加载另一个dll;但这取决于要加载的调用参数。所以我需要多个实例!
  • @AnalogFile 我知道。这就是为什么我写了如何使用 CreateProcess(超过 1 个进程)来实现这一点!
  • @leon22:那么你应该重新考虑架构,可能使用“会话”系统或使用 COM 对象。

标签: c++ winapi dll process loadlibrary


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    如果您将 DLL 设为 COM 宿主并使用 COM 对象,那么这将由每个类实例自动处理。

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

    【讨论】:

    • "您不能将同一个 DLL 多次加载到单个进程中(或者不加载任何效果)。"其实只要文件名不同就可以。
    【解决方案3】:

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

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

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

    这是对抽象问题的抽象答案。如果您能详细解释一下这个 DLL 究竟做了什么,以及为什么需要它的多个实例,那将会很有帮助。

    【讨论】:

    • 这不是一个无能的非全局变量咆哮的地方。具体的问题是多次调用 LoadLibrary 是否也会加载 DLL 中资源的多个副本 - 还是只加载一个副本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-27
    • 1970-01-01
    • 2011-11-07
    相关资源
    最近更新 更多