当前位置: 代码迷 >> 综合 >> VC2005-应用程序正常初始化失败-0xc0150002(转载)
  详细解决方案

VC2005-应用程序正常初始化失败-0xc0150002(转载)

热度:41   发布时间:2024-01-20 14:04:32.0

VC2005-"应用程序正常初始化失败"-0xc0150002(转载)

文章来源:http://microblue.com.cn/it/8823.html

  用VC2005编译的程序,编译时没有任何错误,但是运行时就是提示"应用程序正常初始化失败"!! 查找了各方面资料,做了各种尝试,网上说什么的都有:有让安装vc2005 sp1补丁的;有让安装vcredist_x86.exe的; 有让把CRT库的dll直接拷贝到程序目录的; 有让清理注册表的;有让装.NetFramework新版本的;有让查manifest的;

  结果我尝试了半天,几乎都是浪费时间。上面最后一条说的还算正确,只是作者把事情描述得太繁琐了。。现在把处理的方法说一下,省得大家再走弯路:

  1. VC2003、VC2005、VC2008及其后续版本,对底层最基本的CRT、MFC、ATL库都进行了重构,为了避免不同版本的库引起冲突,重构后的库文件一般放在 C://windows/WinSxS 文件夹中,并用特定的文件夹/文件名称进行标识;

  2. 与VC6不同, VC2003、VC2005、VC2008及其后续版本,引入了manifest清单的概念,即应用程序编译后会同时生成对应的.manifest文件,并将该.manifest文件作为资源编译到dll或者exe中去。.manifest文件实际上是一个XML格式的文本文件,里面记录了dll或exe中要引用的CRT、MFC、ATL库的版本和名称。VC6编译的应用程序对CRT、MFC、ATL的dll都是直接调用,而VC2003、VC2005、VC2008编译的程序都是先查询编译到资源中的manifest中的记录,然后按照记录提供的版本和名称去搜寻对应的CRT、MFC、ATL库以及随库发布的.manifest文件,搜寻的路径包括当前目录、C://windows/WinSxS 等等,如果没有找到对应的库文件,则提示"应用程序正常初始化失败";

  3.因此解决这个问题的办法就是:(a)用文本编辑器打开exe或dll对应的.manifest文件,查看它引用的CRT、MFC、ATL库的版本;或者,用UltraEdit直接打开exe或者dll,从资源区中找到编译进去的.manifest信息,找到它引用的CRT、MFC、ATL库的版本;或者,运行程序,当程序弹出"应用程序正常初始化失败"对话框时,在桌面上右键点击"我的电脑"-"管理"-"事件查看器"-"系统",双击查看其中的记录,可以看到出错的原因是因为缺少了某某版本的CRT、MFC、ATL库,记录下这个版本信息;(b)记录到的库的版本信息一般类似于"Microsoft.VC90.DebugCRT"(或"Microsoft.VC90.CRT"),之后到C://windows/WinSxS 或者VC200X的安装文件夹中搜索包含这个字符串的文件夹和文件,将搜索到的dll和.manifest文件都拷贝到应用程序所在的文件夹中,其中,.manifest文件必须重命名为"Microsoft.VC90.DebugCRT.manifest"(或"Microsoft.VC90.CRT")"(这里以Microsoft.VC90.DebugCRT为例),这样应用程序就可以正常运行了;(c)注意:库的.manifest文件和dll要一同拷贝到应用程序根目录去,因为应用程序会将编译到内部的manifest信息与外部的.manifest文件进行对比,之后才会对库的dll进行调用。如果只拷贝库的dll文件是没有用的;

  4.如果本机编译和运行程序都ok,但是将编译好的程序拿到其它机器上确无法运行,则多半也是这个原因。另外,如果提示"应用程序配置不正确",大多也是因为上面所说的CRT、MFC、ATL库版本与应用程序不匹配导致的,可以如法炮制进行解决;

Microsoft Visual C++ 程序的部署

转自:http://www.cnblogs.com/94cool/archive/2010/04/30/1724659.html

由Microsoft Visual C++编译的程序动态链接到C运行时(/MD 或 /MDd),它必须捆绑C运行DLL的一份拷贝(通常被叫作MSVCRT.DLL 或 MSVCRxx.DLL,其中xx代表Visual C++的版本)。

1. 用Microsoft Visual C++ 6.0编译的程序,或者发布在Windows 2000/NT/ME/98 系统
单纯通过拷贝MSVCRxx.DLL文件到应用程序目录或system32目录即可

2. 用Visual Studio 2005以上编译的程序,且发布在Windows XP及以上系统
为了减少DLL引发的配置问题(DLL hell),C和C++运行时由并行 (Side-by-Side) 程序集实现,单纯通过拷贝MSVCRxx.DLL并不足以在非开发环境正常运行程序,必须通过一个清单(manifest)来加载CRT DLL。如果加载C运行时库时没有这个清单,会引发R6034异常。这就是为何CRT DLLs现在位于WinSXS(Windows Side-by-Side)而不在System32目录的原因。

EXE和DLL文件都会有一个manifest文件,里面说明了依赖关系,用Visual Studio 2005编译后,会自动产生与可执行文件同名的manifest文件,如:
app.exe // 可执行文件
app.exe.manifest // dll依赖文件
一般情况下,会把EXE和DLL的manifest文件嵌入到EXE和DLL文件中,外置的manifest就可以删除了。如:
mt.exe /nologo /manifest "./app.exe.manifest" /outputresource:"./app.exe";1
在EXE文件中,最后面的值为1,在DLL文件中,值为2
Microsoft Visual C++运行库DLL文件中则没有嵌入manifest文件,因此需要外部的manifest文件,Visual Studio 2005的manifest名字叫Microsoft.VC80.CRT.manifest,Visual Studio 2008的manifest名字叫Microsoft.VC90.CRT.manifest,所以要将Microsoft.VC80.CRT.manifest,MSVCR80.dll,MSVCP80.dll,MSVCM80.dll 这四个文件拷贝到应用程序目录。如
C:/Test/app.exe
C:/Test/MSVCR80.dll
C:/Test/MSVCP80.dll
C:/Test/MSVCM80.dll
C:/Test/Microsoft.VC80.CRT.Manifest
或者采用Microsoft官方建议,如:
在WinXP以上
C:/Test/app.exe
C:/Test/Microsoft.VC80.CRT/Microsoft.VC80.CRT.manifest
C:/Test/Microsoft.VC80.CRT/msvcr80.dll
C:/Test/Microsoft.VC80.CRT/msvcp80.dll
C:/Test/Microsoft.VC80.CRT/msvcm80.dll
在Win2K以下
C:/Test/app.exe
C:/Test/msvcr80.dll
C:/Test/msvcp80.dll
C:/Test/msvcm80.dll
如果用以上方法还是不能执行,说明Microsoft Visual C++在系统中有多个版本的DLL,程序用到的和发布的Microsoft Visual C++ DLL不匹配,如:
app.Manifest 文件,要求Microsoft.VC90.CRT的DLL,并且版本为9.0.21022.8





















Microsoft.VC90.CRT.manifest文件,指明是Microsoft.VC90.CRT,但版本为9.0.30729.1





http://www.w3.org/2000/09/xmldsig#"> Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity"> VF5ECUAHPV7EnUf+/UIXMPizPvs= http://www.w3.org/2000/09/xmldsig#sha1"> VF5ECUAHPV7EnUf+/UIXMPizPvs= > http://www.w3.org/2000/09/xmldsig#"> Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity"> 3Wg+StVMq2uhx7POnAkl2w4dDmY= http://www.w3.org/2000/09/xmldsig#sha1"> 3Wg+StVMq2uhx7POnAkl2w4dDmY= > http://www.w3.org/2000/09/xmldsig#"> Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity"> /YfRn7UQENzdMeoMHxTgdRMiObA= http://www.w3.org/2000/09/xmldsig#sha1"> /YfRn7UQENzdMeoMHxTgdRMiObA= >


二者版本不一致,导致程序不能运行,解决办法是发布程序要求的9.0.21022.8版本的Microsoft.VC90.CRT文件

3. 还有一种简单办法是在需要部署的机器上安装Visual C++ 2008 Redistributable Package(x86)或者(x64)。
Microsoft Visual C++ 2005 SP1 下载:
http://download.microsoft.com/download/7/9/8/798325b7-8993-4ef9-9148-8db9ff4187fc/vcredist_x86.exe

注:
用Dependency Walker(depends.exe)打开要发布的EXE,从左上角的列表中找出系统中需要依赖的DLL

Powered by Zoundry Raven

  相关解决方案