双击一个老软件,弹窗写着无法定位程序输入点,后面跟着一个 dll 的名字,事件查看器里对应的错误码是 0xc0000139。同一份安装包在别的电脑上能跑,就这台不行,说明程序本身没坏。
这个码的意思是找不到入口
0xc0000139 对应 STATUS_ENTRYPOINT_NOT_FOUND。程序加载某个 dll 时,要调用的函数在这个库里不存在。名字对、路径对、版本不对,报的还是同一个错。所以别看到函数名就去搜文件,先把版本关系理清。
最常见的三个来源
- 程序目录里自带一份旧版运行库 dll,加载时优先用了它,缺新函数。
- 系统的 Visual C++ 运行库版本太老,或者装的是 32 位而程序要 64 位。
- 某个系统 dll 被别的软件安装包覆盖过,版本整体回退。
按这个顺序处理
先看程序安装目录,有没有和系统同名但日期很早的 dll,有就改名备份再试。接着卸载重装对应的 Visual C++ 运行库,注意位数,32 位程序和 64 位系统不代表用 64 位库。再用管理员命令行跑 sfc /scannow,之后跑 DISM 的 RestoreHealth,把系统文件校验一遍。
还是不行就用依赖查看工具打开 exe,看哪个 dll 标红、缺哪个导出函数,函数名往往能直接指向需要的运行库版本。Process Monitor 里过滤 NAME NOT FOUND,也能看到加载失败的完整路径,比一个个猜快得多。
日志里能省一半排查时间
打开事件查看器,应用程序日志里按错误级别筛,找来源是应用程序错误的条目,详情里会写明异常代码和出错模块名,模块名就是那个 dll。
系统日志看服务启动失败,那边记的是驱动和系统组件的问题,和应用程序错误分开看,别混在一堆里找。
不要做的事
别去 dll 下载站抓一个同名文件丢进系统目录。这类站点给的文件经常带壳,版本也对不上,问题会从启动失败变成更麻烦的蓝屏。缺的从来不是那一个文件,是配套的整套运行库。
判断依据:能在别的机器上跑,问题就在环境不在程序。对齐运行库比重装系统快,也比乱换 dll 安全。