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
库版本与应用程序不匹配导致的,可以如法炮制进行解决。