应用程序无法正常启动(0x000007b)或者找不到dll文件(以vcruntime140d.dll为例)的原因原理分析和解决方法(亲测已解决)

Posted 大灬白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了应用程序无法正常启动(0x000007b)或者找不到dll文件(以vcruntime140d.dll为例)的原因原理分析和解决方法(亲测已解决)相关的知识,希望对你有一定的参考价值。

文章目录

一、问题1:由于找不到vcruntime140d.dll。无法继续执行代码。重新安装程序可能会解决此问题。

最近运行exe文件的时候出现了:“由于找不到vcruntime140d.dll。无法继续执行代码。重新安装程序可能会解决此问题。”

上网找了很多文章,也下了一些软件来修复,发现他们都没有说清楚问题根本原因和解决方法,所以写篇文章来记录解决这个问题的原理和过程。
首先,它是vcruntime140d.dll文件找不到了,就说明程序在我们的电脑上的dll路径当中都没有找到这个dll文件。
大致的顺序是这样的:
1)应用程序所在目录
2)系统目录,GetSystemDirectory获取
3)16位系统目录
4)Windows目录,用GetWindowsDirectory获取
5)运行程序的当前目录
6)Path环境变量
具体的顺序会根据操作系统和注册表SafeDllSearchMode键的值会有所变化。想了解的可以参考我之前的文章《DLL劫持病毒的分析》:https://blog.csdn.net/Onlyone_1314/article/details/108818379
回到vcruntime140d.dll文件找不到的问题,那我们就下载一个vcruntime140d.dll,放在当前exe文件下或者放在Windows目录下都行,放在当前exe文件下就是只让你这次的这个文件调用,放在Windows目录下下次就可以让别的程序也调用。

二、问题2:应用程序无法正常启动(0x000007b)。请单击“确定”关闭应用程序。

开始随便下载了一个vcruntime140d.dll,放在当前exe文件的目录下,又出现了下面这个问题:“应用程序无法正常启动(0x000007b)。请单击“确定”关闭应用程序。”

这里就涉及到另一个问题:操作系统的位数和dll文件的位数。任何一个不匹配,就会出现这个问题。我出现这个问题就是这个test.exe是个32位的程序,我们查看test.exe的基本信息:

发现它是用Visual C++编写的Windows 32位控制台程序。但我下的是一个64位的vcruntime140d.dll:

所以程序是能够找到我的这个vcruntime140d.dll的,没用报之前“找不到vcruntime140d.dll”的错,但是因为位数不匹配导致了“应用程序无法正常启动”。
所以我们重新下一个32位的vcruntime140d.dll文件,放在当前exe文件所在的目录:

运行test.exe:

成功解决问题。

三、Windows目录下的SysWOW64和System32的问题

另外就是关于把应该把dll文件放在Windows目录下的SysWOW64还是System32:
System32是Windows操作系统的系统文件夹,是操作系统的中枢,存放的是64位的系统文件。
SysWOW64(Windows-on-Windows 64-bit)是一个Windows操作系统的子系统, 能够运行32位应用 windows操作系统程序, 并且在所有的64-bit 版本的windows上都存在。
所以我们应该把test.exe需要的dll文件放在SysWOW64文件夹下面:

也能成功解决问题。

下面分别测试把vcruntime140d.dll放在SysWOW64和System32文件夹下
(1)SysWOW64和System32文件夹下都没有vcruntime140d.dll文件:

程序显示找不到vcruntime140d.dll。
(2)vcruntime140d.dll文件放在System32文件夹下:

程序显示找不到vcruntime140d.dll。
(3)vcruntime140d.dll文件放在SysWOW64文件夹下:

程序成功运行。
这样,我们就证明了必须把vcruntime140d.dll文件放在SysWOW64文件夹下,test.exe才能运行。

四、exe文件调用dll文件的过程

我们把test.exe放到一个纯净的64位的windows 7操作系统的虚拟机里,运行test.exe:

它首先报的是缺少ucrtbased.dll,我们下载一个64位的ucrtbased.dll放在当前目录:

它又会报缺少api-ms-win-core-timezone-l1-1-0.dll,我们又下载一个64位的api-ms-win-core-timezone-l1-1-0.dll放在当前目录:

之后的过程我就不一个一个dll文件添加截图了,通过这些我们就可以知道其实就是test.exe程序调用这些dll文件和这些dll文件直接的相互调用,我们只要把它们正确的都添加上,程序就可以正常运行:

以上是关于应用程序无法正常启动(0x000007b)或者找不到dll文件(以vcruntime140d.dll为例)的原因原理分析和解决方法(亲测已解决)的主要内容,如果未能解决你的问题,请参考以下文章

C++学习(四六五)应用程序无法正常启动(0x000007b)

Win10 无法加载操作系统,关键系统驱动程序丢失或错误 蓝屏错误代码0x000007b

dubbo服务启动正常,但是访问不到服务,在监测中心也找不服务的原因之一

电脑开机老是显示模块不存在

应用程序无法正常启动0xc00000006

Sqlite 浏览器无法在 Windows 7 上启动