在我们的应用程序中,我们为dll搜索路径提供了一个特殊的结构。由于更新了第三方库,dll的解析现在中断了。使用AddDllDirectory
修复搜索路径的尝试会导致意外问题。
MyApp.exe
是一个C++/MFC
-application,它使用Managed#1.dll
,而Managed#1.dll
又调用了一个本机dll。此外,它还需要安装在不同文件夹中的MyNativeDll.dll
:
Folder structure:
Program Files\MyApp\MyApp.exe
\Managed#1.dll
\x86\Native#1.dll
Program Files\MyDll\MyNativeDll.dll
\Managed#2.dll
\x86\Native#2.dll
我们最初遇到的问题是找不到Native#2.dll
(这个dll是在Managed#2.dll
中第三方库的更新中添加的)。因此,我在DllMain
of MyNativeDll
中添加了以下内容
MyNativeDll.dll::DllMain
{
[...]
SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_DEFAULT_DIRS);
AddDllDirectory("[...]Program Files\MyDll\x86");
}
在此之后,将按预期的方式加载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
的后一次调用失败?
发布于 2020-02-26 11:18:56
事实证明,有问题的调用不是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);
有效地将LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR
从搜索路径中删除。将上述内容替换为
SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_DEFAULT_DIRS | LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR);
解决了这个问题。
https://stackoverflow.com/questions/60372680
复制相似问题