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

时间:2011-03-29 15:14:31

标签: c++ windows dll

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

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

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

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

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

4 个答案:

答案 0 :(得分:2)

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

你可能不想使用它也可能导入,但它会变得非常繁琐!

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

这个问题已经过时了,但我在谷歌首先发现了这个问题,因为我遇到了一个非常类似的问题,然后我在别处找到了更好的解决方案这是我发现的解决方案,在另一个线程中解释:延迟加载DLL。

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

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