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

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

你可能感兴趣的:(C++,c,windows,Microsoft,mfc)