AddDllDirectory会干扰后续的LoadLibraryExW

AddDllDirectory interferes with subsequent LoadLibraryExW

本文关键字:LoadLibraryExW 干扰 AddDllDirectory      更新时间:2023-10-16

在我们的应用程序中,我们有一个特殊的dll搜索路径结构。由于第三方库的更新,dll的解析现在已中断。尝试使用AddDllDirectory修复搜索路径导致出现意外问题。

MyApp.exe是一个C++/MFC-应用程序,并使用Managed#1.dll,后者反过来调用本机dll。此外,它需要安装在不同文件夹中的MyNativeDll.dll

Folder structure:
Program FilesMyAppMyApp.exe
Managed#1.dll                  
x86Native#1.dll
Program FilesMyDllMyNativeDll.dll
Managed#2.dll
x86Native#2.dll

我们最初遇到的问题是找不到Native#2.dll(此dll是在Managed#2.dll中第三方库的更新中添加的(。所以我在MyNativeDllDllMain中添加了以下内容:

MyNativeDll.dll::DllMain
{
[...]
SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_DEFAULT_DIRS);
AddDllDirectory("[...]Program FilesMyDllx86");
}

之后,Native#2.dll按预期加载。

但是:现在当MyApp.exe加载Managed#1.dll时,此调用失败,因为Managed#1.dll无法加载Native#1.dll。现在有问题的调用是(以下是在一些第三方库中(:

Managed#1.dll::Foo()
{
LoadLibraryExW("Native#1.dll", NULL, 0);  //<-- This searches in the wrong path
}

根据文档,AddDllDirectory应该只在搜索路径中添加一些目录。

AddDllDirectory如何导致后一个对LoadLibraryExW的调用失败?

事实证明,有问题的调用不是AddDllDirectory(),而是以前的SetDefaultDllDirectories()

该文档列出了许多标志(LOAD_LIBRARY_SEARCH_APPLICATION_DIRLOAD_LIBRARY_SEARCH_SYSTEM32LOAD_LIBRARY_SEARCH_USER_DIRS(,并指出LOAD_LIBRARY_SEARCH_DEFAULT_DIRS是这三个标志的组合。

无论如何,还有另一个选项LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR,此列表中未提及。所以呼叫

SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_DEFAULT_DIRS);

有效地将CCD_ 25从搜索路径中移除。用代替上述

SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_DEFAULT_DIRS | LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR);

解决了问题。