客户那边有一台老工控机,跑一个十年前写的采集程序,开机报错:无法启动此程序,因为计算机中丢失 mfc42d.dll。他们从某个 DLL 下载站下了一个放进 System32,重启后程序是能开了,杀毒软件却报警说文件被篡改。
这个 dll 是调试版,正常系统不该有
文件名结尾带 d 的,比如 mfc42d.dll、msvcrtd.dll,都是调试版运行库。正式发布的软件应该链接 Release 版本,用的是 mfc42.dll 而不是带 d 的那个。系统里缺它,通常说明这个程序本身就是拿 Debug 配置编译打包发出来的,属于开发方的问题。
正确的解决方向
- 联系软件提供方,要一个 Release 版本的程序,这是根治办法
- 装对应版本的 Visual C++ 运行库,MFC 42 对应 VC6 那一代
- 确实拿不到源码,只能找同一台机器或同版本开发环境里的原件拷过去
网上下载站给的 dll 是最不可取的。这类文件十个里有一个被塞了后门,而且位数不对还会报 0xc000007b 那个架构错误。
临时顶一下怎么放文件
如果只能自己动手,把拿到的 dll 放进程序自己的目录,别急着塞 System32。程序优先加载同目录的 dll,这样不会污染系统,也方便撤销。放好之后用 regsvr32 一般不用,MFC 是普通动态库不是 COM 组件,注册反而会报错。
copy mfc42d.dll 程序安装目录
where mfc42d.dll用 where 确认程序实际加载的是哪个位置的 dll,比凭感觉放靠谱。
怎么判断这个 dll 干不干净
看数字签名,右键属性里的数字签名页,微软出的运行库都有签名。没有签名的,直接扔掉。再看文件大小和版本,正常 mfc42d.dll 在 1MB 上下,几十 KB 的基本是假的。
结论很直白:带 d 的 dll 是软件打包时没切 Release 的锅,找开发方要新包最省事;实在没法,才考虑手动补文件,而且要放程序目录、认准签名。