我有一个例子,我需要将 Win32 DLL 加载到进程中。对于这些 DLL 的依赖项,我需要“默认搜索路径”生效,最后搜索 PATH 环境变量。不过,我还需要搜索父库本身的目录。
默认情况下,LoadLibrary 会搜索 PATH 环境变量。但不搜索加载库的父目录。
但是,传递任何 LOAD_LIBRARY_SEARCH_DLL_* 函数不会保留在“标准路径”中的搜索。因此,我能想到的在 LoadLibrary 中启用 LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR 的任何选项都会导致从候选列表中删除 PATH。所以这似乎是一个或:在加载 DLL 旁边搜索,或搜索 PATH,但不能同时搜索两者。
有解决办法吗?
我目前考虑的最佳选择是手动解析 PATH 并使用 AddDllDirectory 添加它。但这真的很难看。
我对 LoadLibraryExW 文档的阅读是,您可以组合标志来获得您想要的行为:
例如,如果 Lib2.dll 是 C:\Dir1\Lib1.dll 的依赖项,则使用 [LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR] 加载 Lib1.dll 会导致系统仅在 C:\Dir1 中搜索 Lib2.dll。要在 C:\Dir1 中搜索 Lib2.dll 以及 DLL 搜索路径中的所有目录,请将 [LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR] 与 LOAD_LIBRARY_DEFAULT_DIRS 组合起来。
请注意,这似乎要求您调用 LoadLibraryExW 来提供根 DLL 的完全限定路径。 所以我认为你必须做类似的事情:
HMODULE hmodLib1 =
LoadLibraryExW(L"C:\\Dir1\\Lib1.dll", NULL,
LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR |
LOAD_LIBRARY_DEFAULT_DIRS);
假设 Lib1.dll 依赖于 Lib2.dll,它应该首先在 C:\Dir1 中查找 Lib2.dll,如果不存在,则在通常的位置(包括 PATH 目录)中搜索。
这又是我的读物。 多年来,搜索规则变得极其复杂,并且文档可能很难解析。