1. 程式人生 > 實用技巧 >應用程式無法正常啟動(0x000007b)或者找不到dll檔案(以vcruntime140d.dll為例)的原因原理分析和解決方法(親測已解決)

應用程式無法正常啟動(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檔案直接的相互呼叫,我們只要把它們正確的都新增上,程式就可以正常執行:
在這裡插入圖片描述