GetLastError() 返回 126,对应的错误是:
ERROR_MOD_NOT_FOUND (126)
"指定的模块找不到。"
这不一定 意味着 .dll 文件本身不存在,而是表示 Windows 无法加载该 DLL 或其依赖项 。即使你确认 mccv.dll 路径存在,仍可能因以下原因导致 LoadLibraryA 失败并返回 126:
🔍 常见原因及排查方法
✅ 1. DLL 依赖的其他 DLL 缺失
这是最常见的原因!
mccv.dll 可能依赖于:
- Visual C++ 运行库(如
MSVCR140.dll,VCRUNTIME140.dll,ucrtbase.dll等) - 其他第三方 DLL(如 OpenCV、FFmpeg、自定义库等)
👉 解决方法:使用 Dependency Walker 或更现代的工具检查依赖
- 推荐工具 :
- Dependencies(Dependency Walker 的现代替代品,支持 Win10/Win11 和 Side-by-Side 清单)
- 打开
mccv.dll,查看是否有 红色标记 的缺失依赖项。
⚠️ 注意:旧版 Dependency Walker(depends.exe)在 Win10/Win11 上对现代 CRT(如 UCRT)支持不好,会误报缺失,建议用 Dependencies。
✅ 2. 目标 DLL 架构与当前进程不匹配
- 你的程序是 32 位(x86) ,但
mccv.dll是 64 位(x64),或反之。 LoadLibrary在架构不匹配时会直接失败,返回 126。
👉 检查方法:
- 使用
dumpbin /headers mccv.dll(Visual Studio 开发者命令行中可用)- 查看
machine字段:x86→ 32 位x64→ 64 位
- 查看
- 或用 Dependencies 工具,它会显示架构。
✅ 确保你的 EXE 和 DLL 同为 x86 或同为 x64。
✅ 3. 缺少 Visual C++ Redistributable
如果你的 mccv.dll 是用 MSVC 编译的(比如 Visual Studio 2015--2022),它需要对应版本的 VC++ 运行库。
👉 解决方法:
- 安装对应版本的 Microsoft Visual C++ Redistributable :
即使你本机有 VS,目标机器也可能没有安装运行库。
✅ 4. DLL 路径包含非 ANSI 字符或权限问题(较少见)
- 虽然你的路径是
F:\svnroot\...,看起来没问题,但确保:- 当前用户对
mccv.dll有 读取和执行权限 - 路径中没有隐藏的 Unicode 字符(比如从网页复制的路径)
- 当前用户对
- 尝试将 DLL 复制到
C:\temp\mccv.dll,再加载,排除路径干扰。
✅ 5. DLL 入口点(DllMain)初始化失败
- 如果
DllMain中调用了某些 API(如创建线程、加载资源)失败,可能导致 DLL 加载被拒绝。 - 但这种情况通常返回的是 127(ERROR_PROC_NOT_FOUND) 或其他错误,不过也有可能表现为 126。
🛠️ 快速诊断步骤
-
用 Dependencies 打开
mccv.dll→ 查看是否有缺失依赖(红色图标)。
-
确认架构匹配
→ 你的 EXE 是 x86?DLL 是 x86?
-
在命令行用
where mccv.dll确认路径无歧义(可选) -
尝试将 DLL 放到系统目录(如 System32)测试?
→ 不推荐长期这么做,但可用于排除路径问题(注意:放 System32 需要管理员权限,且 32 位 DLL 应放 SysWOW64)
-
使用 Process Monitor(ProcMon)监控文件访问
- 下载:Sysinternals ProcMon
- 过滤
Process Name为你的 exe,Path包含mccv.dll - 查看是否成功打开文件,以及后续是否尝试加载其他 DLL 并失败。
💡 临时验证:能否用 rundll32 加载?
cmd
rundll32 "F:\svnroot\mediacontrol_sky_soft\40-saturn\common_cv\unit\prj_win32\mccv.dll",#
如果也失败,基本确认是 DLL 本身或依赖问题。
总结
❌
LoadLibraryA返回 NULL + GetLastError() = 126✅ 几乎总是因为:依赖 DLL 缺失 或 架构不匹配
请优先使用 Dependencies 工具分析 mccv.dll 的依赖链!