首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >AddDllDirectory干扰后续LoadLibraryExW

AddDllDirectory干扰后续LoadLibraryExW
EN

Stack Overflow用户
提问于 2020-02-24 09:16:19
回答 1查看 984关注 0票数 0

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

MyApp.exe是一个C++/MFC-application,它使用Managed#1.dll,而Managed#1.dll又调用了一个本机dll。此外,它还需要安装在不同文件夹中的MyNativeDll.dll

代码语言:javascript
运行
复制
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中添加了以下内容

代码语言:javascript
运行
复制
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。现在有问题的调用是(在某个第三方库中):

代码语言:javascript
运行
复制
Managed#1.dll::Foo()
{
    LoadLibraryExW("Native#1.dll", NULL, 0);  //<-- This searches in the wrong path
}

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

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

EN

回答 1

Stack Overflow用户

发布于 2020-02-26 11:18:56

事实证明,有问题的调用不是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,这个列表中没有提到这个选项。所以呼吁

代码语言:javascript
运行
复制
SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_DEFAULT_DIRS);

有效地将LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR从搜索路径中删除。将上述内容替换为

代码语言:javascript
运行
复制
SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_DEFAULT_DIRS | LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR);

解决了这个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60372680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档