文章目录
一、问题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文件直接的相互调用,我们只要把它们正确的都添加上,程序就可以正常运行: