【问题标题】:Can I change the name of a dll to load at runtime?我可以更改 dll 的名称以在运行时加载吗?
【发布时间】:2011-03-29 15:14:30
【问题描述】:

假设我有一个名为 middle.dll 的 dll,它正在从 runme.dll 导入函数

我现在有一个替换 runmeDBG.dll,它具有导出为 runme.dll 的所有相同功能

有没有办法使用 middle.dll 但让它链接到从 runmeDBG.dll 而不是 runme.dll 导出的函数?

我可以更改 middle.dll 的代码,但不知道包含在我构建 middle.dll 时要使用的函数的 dll 的名称。

(所有这些都在 C/C++ 和 Mingw 工具集的上下文中)

【问题讨论】:

    标签: c++ windows dll


    【解决方案1】:

    如果您通过使用GetProcAddress 访问DLL 中的所有函数,那么可以,您可以在运行时切换您使用的模块。只需加载替代模块(参见LoadLibrary)并将其句柄用作GetProcAddress 的参数。

    您不会想将它用于太多的导入,但是,它会变得非常乏味!

    【讨论】:

      【解决方案2】:

      我假设 middle.dll 不是你的,它静态链接到 runme.dll。不,在静态链接的情况下无法更改 dll 名称;但是,您可以将 runmeDBG.dll 重命名为 runme.dll 并将其放置在 dll 加载器可以找到它的位置。或者使用清单将可执行文件直接指向特定路径。 runme.dll 不需要位于特定路径,不是吗?

      【讨论】:

      • 您的意思是隐含而不是静态。您不能静态链接到动态链接库。
      • middle.dll 在我的情况下实际上是我的,但我无法控制包含一些它需要调用的函数的 dll 的名称。
      • 如果完成了到 dll 的静态链接,答案似乎是否定的。
      【解决方案3】:

      只需重命名替换并将其放在与可执行文件相同的目录中即可。

      【讨论】:

      • 是的,如果不需要在运行时切换并且您可以更改二进制文件,那么这是一个可行的解决方案。
      【解决方案4】:

      这个问题很老,但我首先在 Google 中找到了它,因为我遇到了一个非常相似的问题,然后我在其他地方找到了更好的解决方案。这是我在另一个线程中解释的解决方案:延迟加载 DLL。

      How do I rename a DLL but still allow the EXE to find it?

      例如,如果 DLL 被设计为静态链接(与接口中的类),但您需要在不更改其接口的情况下实际动态加载它,则此技术可能很有用。您只需告诉 Windows 延迟加载 DLL,当它实际加载 DLL 时,Windows 会调用您的预加载钩子,然后您只需将句柄返回给具有相同接口的不同 DLL(可能具有不同的名称)。

      【讨论】:

        猜你喜欢
        • 2011-11-24
        • 2011-05-31
        • 2021-11-16
        • 2017-08-14
        • 2011-10-03
        • 2018-08-28
        • 2018-01-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多