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