我可以更改 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 的名称以在运行时加载吗?的主要内容,如果未能解决你的问题,请参考以下文章
在运行时从另一个 AppDomain 调试动态加载的 DLL