[英]Delay-load DLL in windows: can I dynamically choose what DLL name to look for? (c++)
[英]Can I change the name of a dll to load at runtime?
说我有一个名为middle.dll的dll,它从runme.dll导入函数
我现在有一个替换的runmeDBG.dll,它具有与runme.dll导出的所有相同功能
有没有一种使用middle.dll的方法,但它具有链接到runmeDBG.dll而不是runme.dll导出的函数的功能?
我可以更改middle.dll的代码,但不知道将包含在构建Middle.dll时要使用的功能的dll名称。
(所有这些都是在C / C ++和Mingw工具集的上下文中)
如果通过使用GetProcAddress
访问DLL中的所有功能,则可以,则可以在运行时切换使用哪个模块。 只需加载备用模块(请参见LoadLibrary
)并将其句柄用作GetProcAddress
的参数。
您也不想将其用于导入,但是,它将变得非常乏味!
这个问题很旧,但是我遇到了一个非常相似的问题后,首先在Google中找到了它,然后在其他地方找到了更好的解决方案。 这是我在另一个线程中找到的解决方案:延迟加载DLL。
例如,如果将DLL设计为静态链接(接口中带有类),但是您实际上需要动态加载它而不更改其接口,则此技术很有用。 您只需要告诉Windows延迟加载DLL,并且当它实际加载DLL时,Windows会调用您的预加载钩子,然后只需将Handle返回到具有相同接口的另一个DLL(可能具有不同的名称)即可。
我假设middle.dll不是您的,并且它静态链接到runme.dll。 不,在静态链接的情况下,无法更改dll名称; 您可以将runmeDBG.dll重命名为runme.dll,并将其放置在dll加载程序可以找到它的位置。 或使用清单将可执行文件直接指向特定路径。 这不是runme.dll位于特定路径的要求,不是吗?
只需重命名替换项,然后将其放在与可执行文件相同的目录中即可。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.