我可以更改 dll 的名称以在运行时加载吗?

Posted

技术标签:

【中文标题】我可以更改 dll 的名称以在运行时加载吗?【英文标题】:Can I change the name of a dll to load at runtime? 【发布时间】: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 工具集的上下文中)

【问题讨论】:

【参考方案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(可能具有不同的名称)。

【讨论】:

以上是关于我可以更改 dll 的名称以在运行时加载吗?的主要内容,如果未能解决你的问题,请参考以下文章

在程序运行时更改 DLL

在运行时从另一个 AppDomain 调试动态加载的 DLL

APK 文件如何包含 DLL 文件? Android可以运行DLL文件吗?

MFC:如何获取 DLL 文件名?

更改运行时库选项对运行时链接的影响

在运行时加载 2 个版本的程序集