msvcrt.dll
C语言运行库执行文件
msvcrt.dll是微软在windows操作系统中提供的C语言运行库执行文件(Microsoft Visual C Runtime Library),其中提供了printf,malloc,strcpy等C语言库函数的具体运行实现,并且为使用C/C++(Vc)编译的程序提供了初始化(如获取命令行参数)以及退出等功能。
进程信息
msvcrt.dll是标准的微软C运行库文件。
系统 DLL文件: 否
常见错误: File Not Found, Missing File, Exception Errors
广告软件: 否
msvcrt.dll (7.0.2600.0)
包含在软件
名字: Windows XP Home Edition, Deutsch
执照: 商业
文件细节
文件日期: 2002-08-29 14:00:00
版本: 7.0.2600.0
文件大小: 322.560字节
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中还支持其他的几种类型的调试,须根据具体情形按需选择。
全局变量的地址或过程的地址。比如x kernel32!*显示Kernel32.dll中的所有可见变量,数据结构和过程。*号是通配符
结果告诉我们,进程中msvcrt.dll存有的过程有_except_handler2以及_except_handler3,而恰恰没有_except_handler4。鉴于以上返回结果,我们可以初步断定,错误的起因是因为程序不能执行MSVCRT.DLL中的_except_handler4_common过程,而且原因是当前缺少这个。此时,我们需要借助Microsoft Dependency Walker进行辅助分析并且确认。
我们启动Microsoft Dependency Walker,打开该dwmapi.dll
此时,我们可以进一步断定,要么是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”。如图2所示:
到这里,问题就已经清楚了。正是由于本机的在启动时调用了用于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目录下。
三、然后打开“开始-运行-输入regsvr32 MSVCRT.DLL”,回车即可解决错误提示!
四、对于初学者,可以使用ReSystem这样的工具替换MSVCRT.DLL以绕开系统的文件保护。
最新修订时间:2024-08-22 16:01
目录
概述
进程信息
参考资料