标题：msvcrt.dll
描述
进程信息msvcrt.dll是标准的微软C运行库文件。
属于： Windows 
系统 DLL文件： 否
常见错误： File Not Found, Missing File, Exception Errors 
安全等级 (0-5): 0
间谍软件： 否 
广告软件： 否
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[1]
软件星级：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中还支持其他的几种类型的调试，须根据具体情形按需选择。附加到该进程之后的结果如下图所示:
(6张)然后，我们可以在图中清晰地看到，当系统加载到“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分析的结果吻合。如下图所示：
  (8张)此时，我们可以进一步断定，要么是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”。如下图所示：
到这里，问题就已经清楚了。正是由于本机的在启动时调用了用于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从而产生了此错误。
注：本例中并没有介绍使用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以绕开系统的文件保护。