[英]How can I place a dependency of a plugin DLL in a specific location relative to it, so that it's found during runtime?
我正在編寫一個程序 A.exe,它使用LoadLibrary
在運行時加載外部 DLL B.dll。
B.dll 位於 A.exe 附近的特定目錄中,但與 A.exe 不在同一目錄中。 A.exe 知道在運行時在哪里可以找到它。
B.dll is dynamically linked (by GCC, not during runtime) to another 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 有一個簡單的方法來滿足這個要求!
在動態庫搜索順序的文檔和LoadLibraryEx
的文檔中找到解決方案。
我們需要使用LoadLibrary
,而不是使用LoadLibraryEx
。 據我了解,兩者之間的主要區別在於后者采用可選的 flags 參數來自定義它的功能。
在LoadLibraryEx
的標志中,我們可以傳遞LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR
來指定在加載 DLL 時,只應在其所在的目錄中查找其依賴項。 如果我們還希望 Windows 在常規搜索路徑中查找,我們可以將其與LOAD_LIBRARY_SEARCH_DEFAULT_DIRS
結合使用。
例子:
HMODULE handle = LoadLibraryExA(
path, NULL, LOAD_LIBRARY_SEARCH_DEFAULT_DIRS | LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR);
我可能對細節不准確,請根據需要參考所述文檔。
感謝@IInspectable 為我指明了正確的方向。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.