我正在编写程序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有所了解。
结果证明WinAPI有一种简单的方法可以完全满足此要求!
在docs for dynamic library search order和LoadLibraryEx
的文档中找到的解决方案。
而不是使用LoadLibraryEx
,我们需要使用LoadLibrary
。据我了解,两者之间的主要区别在于后者采用了可选的flags参数来自定义其功能。
在LoadLibraryEx
的标志中,我们可以传递LoadLibraryEx
以指定在加载DLL时,仅应查找其所在的目录以查找其依赖项。如果我们还希望Windows在常规搜索路径中查找,则可以将其与LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR
组合。
示例:
LOAD_LIBRARY_SEARCH_DEFAULT_DIRS
我可能在细节上不准确,请根据需要参考上述文档。
感谢@IInspectable向我指出正确的方向。