现在的位置: 首页 > 综合 > 正文

编译时没有任何错误,但是运行时就是提示“应用程序正常初始化失败”!!

2012年06月23日 ⁄ 综合 ⁄ 共 1224字 ⁄ 字号 评论关闭

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

”,之后到
C://windows/WinSxS

或者
VC200X

的安装文件夹中搜索包含这个字符串的文件夹和文件,将搜索到的
dll


.manifest

文件都拷贝到应用程序所在的文件夹中
,

其中
,.manifest

文件必须重命名为“
Microsoft.VC90.DebugCRT.manifest


(

这里以
Microsoft.VC90.DebugCRT

为例
)

,这样应用程序就可以正常运行了;(
c

)注意:库的
.manifest

文件和
dll

要一同拷贝到应用程序根目录去
,

因为应用程序会将编译到内部的
manifest

信息与外部的
.manifest

文件进行对比
,

之后才会对库的
dll

进行调用。如果只拷贝库的
dll

文件是没有用的;

 

4.

如果本机编译和运行程序都
ok

,但是将编译好的程序拿到其它机器上确无法运行,则多半也是这个原因。另外
,

如果提示
"

应用程序配置不正确
"

,大多也是因为上面所说的
CRT


MFC


ATL


库版本与应用程序不匹配导致的,可以如法炮制进行解决。

抱歉!评论已关闭.