我如何将插件DLL的依赖项放在相对于它的特定位置,以便在运行时找到它?

问题描述 投票:0回答:1

我正在编写程序A.exe,该程序使用LoadLibrary在运行时加载外部DLL B.dll。

B.dll位于A.exe附近的特定目录中,但与A.exe不在同一目录中。 A.exe知道在运行时可以在哪里找到它。

B.dll被动态链接(通过GCC,而不是在运行时)链接到另一个DLL C.dll。

在运行时,如果像这样进行设置,则可以成功运行:

myapp/
. . . . A.exe
. . . . C.dll
. . . . myplugins/
. . . . . . . . . B.dll

但是,我希望这样设置:

myapp/
. . . . A.exe
. . . . myplugins/
. . . . . . . . . B.dll
. . . . . . . . . C.dll

在此设置中,LoadLibrary在加载B.dll时失败,因为它找不到其依赖项C.dll,因为它与主机可执行文件不在同一目录中。

我如何在A.exe或其构建过程不了解C.dll的情况下使首选安装工作?这个想法是B.dll是A.exe的插件,因此A.exe知道在哪里可以找到它。但是,它不必了解C.dll。只有B.dll应该对C.dll有所了解。

c windows dll
1个回答
0
投票

结果证明WinAPI有一种简单的方法可以完全满足此要求!

docs for dynamic library search orderLoadLibraryEx的文档中找到的解决方案。

而不是使用LoadLibraryEx,我们需要使用LoadLibrary。据我了解,两者之间的主要区别在于后者采用了可选的flags参数来自定义其功能。

LoadLibraryEx的标志中,我们可以传递LoadLibraryEx以指定在加载DLL时,仅应查找其所在的目录以查找其依赖项。如果我们还希望Windows在常规搜索路径中查找,则可以将其与LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR组合。

示例:

LOAD_LIBRARY_SEARCH_DEFAULT_DIRS

我可能在细节上不准确,请根据需要参考上述文档。

感谢@IInspectable向我指出正确的方向。

© www.soinside.com 2019 - 2024. All rights reserved.