假设我有一个名为middle.dll的dll从runme.dll导入函数
我现在有一个替换runmeDBG.dll,它具有与runme.dll一样导出的所有相同功能
有没有办法使用middle.dll但是它链接到从runmeDBG.dll而不是runme.dll导出的函数?
我可以更改middle.dll的代码但不知道将包含我在构建middle.dll时使用的函数的dll的名称。
(所有这些都在C / C ++和Mingw工具集的上下文中)
答案 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>