AddDllDirectory会干扰后续的LoadLibraryExW
AddDllDirectory interferes with subsequent LoadLibraryExW
在我们的应用程序中,我们有一个特殊的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
中第三方库的更新中添加的(。所以我在MyNativeDll
的DllMain
中添加了以下内容:
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_DIR
、LOAD_LIBRARY_SEARCH_SYSTEM32
、LOAD_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);
解决了问题。