<Bug summary>video2x-qt6.exe 双击无法启动——旧版 MSVCP140.dll(14.00) 与 VC143 编译的二进制不匹配,启动即访问冲突崩溃
Author: yxly33126Created Aug 24, 2026Updated Aug 24, 2026
Labelstype:Bugstate:Backlog
环境
- 系统:Windows 10 22H2(19045.7663,x64)
- 版本:Video2X Qt6 6.4.0(video2x-qt6.exe 时间戳 0x67941d49)
- 安装路径:D:\Program Files\Video2X Qt6\(VC++ 运行库未随包部署在应用目录)
问题现象
- 双击 video2x-qt6.exe 后进程短暂出现即崩溃退出,无任何 GUI 窗口
- 已注册 VC++ Redist(注册表显示 Microsoft Visual C++ v14 Redistributable (x64) 14.51.36247 已安装),但 C:\Windows\System32\MSVCP140.dll 仍是 2016 年的旧版 14.00.24215.1(WinSxS 中也无 vc142/vc143 CRT 程序集)→ 程序实际加载了旧版运行库
WER 崩溃记录(事件 ID 1000,多次复现、偏移固定) 错误应用程序: video2x-qt6.exe 版本 0.0.0.0 错误模块: MSVCP140.dll 版本 14.0.24215.1 异常代码: 0xc0000005 (访问冲突) 偏移 0x0000000000018c34
根因分析
- video2x-qt6.exe 用 MSVC v143 工具链编译(链接器版本 14.42),静态导入 MSVCP140.dll / VCRUNTIME140.dll / VCRUNTIME140_1.dll;ncnn.dll 还额外依赖 VCOMP140.dll(OpenMP)
- 程序集部署在 D:\Program Files 下但未携带应用本地 VC 运行库,仅依赖系统运行库
- 系统 System32 中的 MSVCP140.dll 为 2016 年旧版 14.00,与新版 14.5x 内部实现/符号布局差异巨大 → 新程序调用旧库导出函数时发生地址越界 → 固定偏移 0x18c34 访问冲突
- 注册表显示 Redist 已装新版本,但 System32 实际 DLL 未更新(疑似安装被跳过/被旧文件覆盖),导致“以为有新版、实际加载旧版”的陷阱
解决方案(已验证) 从 VS 自带 Redist(或官方最新 VC++ 2015-2022 x64 运行库)取 14.51 版,以应用本地方式复制 11 个 DLL 到应用目录: msvcp140.dll、msvcp140_1.dll、msvcp140_2.dll、msvcp140_atomic_wait.dll、msvcp140_codecvt_ids.dll、vcruntime140.dll、vcruntime140_1.dll、vcruntime140_threads.dll、concrt140.dll、vccorlib140.dll、vcomp140.dll 复制后程序正常启动(窗口 Video2X Qt6 6.4.0,进程稳定、响应正常),同目录的 CLI video2x.exe 一并修复。
建议官方处理
- 发行包内嵌应用本地 VC 运行库(Qt/FFmpeg 便携版通用做法):在 x64/ 下随包携带上述 11 个 CRT/OpenMP DLL,彻底摆脱对系统运行库版本的不确定性
- 安装程序检测并校验 System32 中 MSVCP140.dll 版本,过旧时强制提示/安装最新 VC++ 2015-2022 Redist
- 排查 Redist 安装为何出现“注册表为新版、System32 DLL 仍旧版”的不一致,避免其他 v143 程序同样中招
Source: k4yt3x/video2x