msvcrt.dll

msvcrt.dll

msvcrt.dll是微軟在windows作業系統中提供的C語言運行庫執行檔案(Microsoft Visual C Runtime Library),其中提供了printf,malloc,strcpy等C語言庫函式的具體運行實現,並且為使用C/C++(Vc)編譯的程式提供了初始化(如獲取命令行參數)以及退出等功能。

基本介紹

  • 外文名:msvcrt.dll
  • 屬於:Windows
  • 安全等級:0
  • 間諜軟體:否
描述,進程信息,檔案信息,檔案hashes,版本信息,產生原因,如何解決,

描述

進程信息

msvcrt.dll是標準的微軟C運行庫檔案。
系統 DLL檔案: 否
常見錯誤: File Not Found, Missing File, Exception Errors
廣告軟體: 否
msvcrt.dll (7.0.2600.0)
包含在軟體
名字: Windows XP Home Edition, Deutsch
執照: 商業
檔案細節
檔案路徑: C:\WINDOWS\WinSxS\x86_Microsoft.Windows.CPlusPlusRuntime_6595b64144ccf1df_7.0.0.0_x-ww_2726e76a \ msvcrt.dll
檔案日期: 2002-08-29 14:00:00
版本: 7.0.2600.0
檔案大小: 322.560位元組

檔案信息

軟體大小:0.13 Mb
軟體星級:2.5
軟體語言:中文簡體
開 發 商:HOMEPAGE
軟體授權:免費版本
更新時間:2010-01-1816:54:52
套用平台:XP/2K/Vista/9x

檔案hashes

CRC32: BC31AE30
MD5: 4200 BE38 08F6 406D BE45 A7B8 8DAE 5035
SHA1: F030 9D51 6275 4358 F80E ED4C FF93 D036 2B0F DFFD

版本信息

公司名稱: Microsoft Corporation
檔案描述: Windows NT CRT DLL
檔案作業系統: Windows NT, Windows 2000, Windows XP, Windows 2003
檔案類型: Application
檔案版本: 7.0.2600.0
內部名: msvcrt.dll
法律著作權: © Microsoft Corporation. All rights reserved.
原始的檔案名稱: msvcrt.dll
產品名稱: Microsoft® Windows® Operating System
產品版本: 6.1.8638.0

產生原因

某些外文軟體在安裝後會引起系統的崩潰,這對於在國外工作學習又使用中文系統的朋友們通常意味著一場災難,下面的文字以飛信的一個經典BUG為例,剖析這種現象產生的原因以及解決方法。
首先,我們讓該問題重現,即雙擊飛信客戶端的桌面圖示,讓其彈出該錯誤對話框。錯誤提示出現了,我們先不急著點擊“OK(確定)”按鈕,而是啟動一個調試程式。(本例中使用著名的Microsoft Windbg工具進行調試分析)然後在“File(檔案)”選單中選擇“Attach to a Process...(附加到一個進程)”。這裡之所以要選擇Attach to a Process就是因為我們要將調試器跟蹤到當前這個產生錯誤的進程,然後從記憶體中實時察看相關的執行緒堆疊甚至API函式的調用。Windbg中還支持其他的幾種類型的調試,須根據具體情形按需選擇。附加到該進程之後的結果如下圖所示:
然後,我們可以在圖中清晰地看到,當系統載入到“dll”時掛起,就是圖中的"Warning: Break-in time out, suspending.",在Windows中的表現也就是彈出了上述的錯誤對話框,並且我們還沒有點擊“確定”按鈕,於是程式暫時掛起。因此,我們可以判斷,啟動時載入的dll在執行某個函式過程的時候遇到了錯誤。那么究竟是什麼樣的函式呢?根據錯誤對話框的信息,我們可以初步猜測是MSVCRT.dll中的_except_handler4_common。於是,我們需要查找一下當前進程中有關該過程的現狀,所以執行"x msvcrt!_except_handler*"命令,返回的結果也在上圖中的底部。在Windbg中,x是查找符號的命令,可以用來查找全局變數的地址或過程的地址。比如x kernel32!*顯示Kernel32.dll中的所有可見變數,數據結構和過程。*號是通配符,代替任意的字元串,為了查找全部的,我們需要使用該通配符。(其實如果你執行“x msvcrt!_except_handler4_common”你會發現沒有任何結果,也就是找不到,其實這也就是出現該錯誤的原因,我們後文分析。因此退一步不輸入"4_common",查找所有_except_handler過程)
結果告訴我們,進程中msvcrt.dll存有的過程有_except_handler2以及_except_handler3,而恰恰沒有_except_handler4。鑒於以上返回結果,我們可以初步斷定,錯誤的起因是因為程式不能執行MSVCRT.DLL中的_except_handler4_common過程,而且原因是當前缺少這個。此時,我們需要藉助Microsoft Dependency Walker進行輔助分析並且確認。
我們啟動Microsoft Dependency Walker,打開該dwmapi.dll,可以發現,該DLL檔案的運行將會首先調用MSVCRT.DLL,而且下圖中也標示出來了,在當前調用的MSVCRT.DLL中,缺少一個函式"_except_handler4_common",這起好與我們看到的錯誤現象相以及Windbg分析的結果吻合。如下圖所示:
此時,我們可以進一步斷定,要么是DLL版本不對,要么就是dwmapi.dll有問題。而這個程式調用的是XP系統的systemroot.system32下面的MSVCRT.DLL,那么我們猜想,是不是Vista版本下的MSVCRT.DLL就存在一個新版本——即第4版的_exception_handler4呢?我們從Microsoft Windows Vista RTM中提取出位於systemroot.system32下面的MSVCRT.DLL,其版本為“7.0.6001.18000 (longhorn_rtm.080118-1840)”,然後再次使用Dependency Walker打開,發現其中果然存在該新的函式!即“_except_handler4_common”。如下圖所示:
msvcrt.dll
到這裡,問題就已經清楚了。正是由於本機的在啟動時調用了用於Vista的DLL組件dwmapi.dll,而該DLL又要嘗試調用一個Vista下msvcrt.dll才有的過程,才出現了該錯誤提示。因為我們發現,該錯誤提示並不影響之後程式的正常使用,而且我們所使用的環境是Windows XP而非Vista,所以推斷該調用dwmapi.dll的過程是非必要的,於是將其重命名或是刪除到資源回收筒,再次啟動, 迎來的是程式正常的使用……之後我查閱了大量的KB資料以及Visual Studio的MSDN資料,發現_except_handler是VC++編譯器自帶的一個內部異常處理。而版本4的_except_handler4_common handler又僅存在於Vista以及之後的系統之中。而且值得注意的是,很多這樣子的錯誤都是由於系統中存在有來自更高級版本系統的檔案造成的,而檔案的來源於一般有幾種,一般是修改系統時自己放進去的或者別的安裝程式帶入的,也有情況是盜版改版的作業系統中存有的,再有就是本例中的情形——安裝程式可同時用於Windows XP以及Windows Vista。可能是由於XP英文版與中文版的環境的不同,載入調用為Vista準備的dwmapi.dll從而產生了此錯誤。
msvcrt.dll
註:本例中並沒有介紹使用Dependency Walker的“Profile(剖析)”功能,因為該啟動不是靠單檔案的,因此比較複雜,而且本例中因為該錯誤不能成功剖析整個啟動過程,剖析過後同樣能夠發現問題。

如何解決

一、如果您的系統提示“沒有找到MSVCRT.DLL”或者“缺少MSVCRT.DLL”等類似錯誤信息,請把MSVCRT.DLL下載到本機
二、直接拷貝該檔案到系統目錄里:
1、Windows 95/98/Me系統,則複製到C:WindowsSystem目錄下。
2、Windows NT/2000系統,則複製到C:WINNTSystem32目錄下。
3、Windows XP系統,則複製到C:Windows\System32目錄下。
4、windows vista/7 系統,也是複製到C:\WINDOWS\system32 目錄下。
三、然後打開“開始-運行-輸入regsvr32 MSVCRT.DLL”,回車即可解決錯誤提示!
四、對於初學者,可以使用ReSystem這樣的工具替換MSVCRT.DLL以繞開系統的檔案保護。

相關詞條

熱門詞條

聯絡我們