You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LoadLibraryEx调用失败(错误码126):找不到DLL或其依赖项

问题描述

我正在编写一个加载DLL的程序,其中待加载的a.dll依赖于另一个b.dll:

  • 使用LoadLibrary函数时,只要b.dll位于可执行文件的同一目录下,无论a.dll在何处都能成功加载。
  • 但需求要求b.dll不能放在可执行文件目录中,因此改用LoadLibraryEx函数(带flags参数可精确控制DLL加载路径),但无论尝试何种flags,调用均失败,返回错误码126。

相关代码示例:

HANDLE handle;

// 当b.dll在可执行文件同目录时,此调用成功
handle = LoadLibrary("a.dll");
FreeLibrary(handle);

// flags设为0时,行为和LoadLibrary一致,此调用也成功
handle = LoadLibraryEx("a.dll", NULL, 0);
FreeLibrary(handle);

// 即使b.dll在可执行文件同目录,此调用失败
handle = LoadLibraryEx("a.dll", NULL,
    LOAD_LIBRARY_SEARCH_APPLICATION_DIR);

// 即使b.dll在a.dll同目录,此调用失败
handle = LoadLibraryEx("a.dll", NULL,
    LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR);

// 即使b.dll在AddDllDirectory指定的目录中,此调用失败
DLL_DIRECTORY_COOKIE cookie =
    AddDllDirectory(L"C:\\Fully\\Qualified\\Path");
handle = LoadLibraryEx("a.dll", NULL,
    LOAD_LIBRARY_SEARCH_USER_DIRS);
RemoveDllDirectory(cookie);
解决方案

错误码126表示系统找不到指定的模块,核心问题是当使用LoadLibraryEx的特定flags时,系统的DLL搜索路径逻辑和LoadLibrary默认行为不同,依赖的b.dll无法被找到。以下是针对性的解决办法:

1. 组合使用多个搜索路径flags

单独使用单个flags会限制搜索范围,需要组合多个flags来覆盖依赖DLL的位置:

  • 如果b.dll在exe目录,组合LOAD_LIBRARY_SEARCH_APPLICATION_DIR和LOAD_LIBRARY_SEARCH_DEFAULT_DIRS
  • 如果b.dll在a.dll所在目录,组合LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR和LOAD_LIBRARY_SEARCH_DEFAULT_DIRS
  • 如果b.dll在自定义目录,组合LOAD_LIBRARY_SEARCH_USER_DIRS和LOAD_LIBRARY_SEARCH_DEFAULT_DIRS

示例代码(以自定义目录为例):

DLL_DIRECTORY_COOKIE cookie = AddDllDirectory(L"C:\\Fully\\Qualified\\Path");
// 组合flags,确保系统能搜索到依赖的b.dll
HANDLE handle = LoadLibraryExW(L"a.dll", NULL, 
    LOAD_LIBRARY_SEARCH_USER_DIRS | LOAD_LIBRARY_SEARCH_DEFAULT_DIRS);
RemoveDllDirectory(cookie);

if (handle == NULL) {
    DWORD err = GetLastError(); // 获取具体错误码排查
} else {
    FreeLibrary(handle);
}

2. 统一字符串编码

代码中混合使用窄字符串("a.dll")和宽字符串(L"C:\\...")可能导致路径解析错误,建议统一使用宽字符版本API,参数全部用宽字符串(L"a.dll")。

3. 确保自定义目录路径有效

调用AddDllDirectory时必须传入完整绝对路径,不能用相对路径;同时确认目录存在且程序有读取权限。

4. 全局设置DLL搜索路径(可选)

如果需要让所有后续DLL加载自动搜索指定目录,可使用SetDefaultDllDirectories一次性设置全局路径:

// 设置全局默认搜索路径包含自定义目录和exe目录
SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_USER_DIRS | LOAD_LIBRARY_SEARCH_APPLICATION_DIR);
DLL_DIRECTORY_COOKIE cookie = AddDllDirectory(L"C:\\Fully\\Qualified\\Path");

// 此时调用LoadLibraryEx无需指定flags,也能找到b.dll
HANDLE handle = LoadLibraryExW(L"a.dll", NULL, 0);

RemoveDllDirectory(cookie);

关键原理

当LoadLibraryEx使用非0的flags时,系统会禁用部分默认DLL搜索路径,必须显式指定所有需要搜索的路径。LOAD_LIBRARY_SEARCH_DEFAULT_DIRS会包含系统目录和安全注册目录,补充这个flags能避免遗漏必要的系统依赖,同时配合其他flags覆盖自定义路径。

内容的提问来源于stack exchange,提问作者Whirvis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 05:42:46