簡體   English   中英

如何將插件 DLL 的依賴項放置在相對於它的特定位置,以便在運行時找到它?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM