当前位置: 首页 > article >正文

vs2008在打了SP1补丁后编译版本不匹配,导致“应用程序配置不正确,应用程序未能启动

VS 2008 的Bug,因为编译的版本manifest跟发行的版本号的问题,在微软的MSDN ONLINE里面有说明以及处理方法
可以用其中一种方法解决
在所有的Stdaf.h中前面加入两行
#define _BIND_TO_CURRENT_MFC_VERSION 1
#define _BIND_TO_CURRENT_CRT_VERSION 1

VC9编译的程序在没有装过VC9(确切的说是.Net Framework3.5)的机器上运行时,如果提示“由于应用程序配置不正确,应用程序未能启动。重新安装应用程序可能会纠正这个问题。”这个错误,那 么就说明该程序动态链接了VC9的运行时库,(如果还用到了MFC,那么可能动态链接了VC9的MFC库,同理还有ATL库),以及缺少对应的 manifest文件,程序在目标机器上没有找到这些库和配置文件,因此导致了这个错误。出现这种情况的VC9编译器可能存在3个版本,接下来分别阐明:
1、没有打过任何补丁的VS2008
该 版本对应的CRT/MFC/ATL库的版本号为9.0.21022.8,这个版本号在后面会用到。这个版本的程序部署比较简单,直接把VC安装目录下的 redist目录(C:\Program Files\Microsoft Visual Studio 9.0\VC\redist)中需要的库以及对应的manifest文件拷贝到执行程序同目录下,这样程序到任何机器上都能够正常运行了。
2、打过SP1补丁的VS2008
打 过该补丁后,系统中存在着两个版本的CRT/MFC/ATL库,版本号分别为9.0.21022.8和9.0.30729.1,这导致了manifest 文件中记录的版本号和实际库的版本号不一致(程序要求它们的版本号一致才能运行)。这个版本的程序部署需要两个步骤,首先要使manifest文件中依赖 项的版本号与实际库的版本号一致,均为9.0.30729.1,方法是在工程设置中增加一个宏定义_BIND_TO_CURRENT_VCLIBS_VERSION, 该宏定义于C:\Program Files\Microsoft Visual Studio 9.0\VC\include\crtassem.h文件中,然后重新编译程序。接下来还是将VC安装目录下的redist目录(C:\Program Files\Microsoft Visual Studio 9.0\VC\redist)中需要的库以及对应的manifest文件拷贝到执行程序同目录下,然后修改manifest文件中依赖项的版本号为 9.0.21022.8,这样使得程序误以为该目录下库的版本号为9.0.21022.8(实际上是9.0.30729.1版本),这样程序到任何机器上 都能够正常运行了。
3、打过SP1补丁与SP1 ATL 安全更新 (KB973675)的VS2008
这 是最新的更新。在SP1补丁之后,微软又于近日发布了一个用于智能设备的 Microsoft Visual Studio 2008 Service Pack 1 ATL 安全更新 (KB973675), 该补丁又将CRT/MFC/ATL库的版本号升级,为9.0.30729.4148,这次升级比较好,manifest文件与库的版本号一致了,不像 SP1一样升级的不彻底。这样只需要在工程设置中增加一个宏定义_BIND_TO_CURRENT_VCLIBS_VERSION,接下来重新编译程序,然后直接把VC安装目录下的redist目录中需要的库以及对应的manifest文件拷贝到执行程序同目录下,这样程序到任何机器上都能够正常运行了。
顺便提一下,如果不想在发布程序时带上这些库和manifest文件(如果没有必要的话),那么可以采用静态编译CRT和MFC,然后把manifest文件添加到资源中,这样编译出的程序只要一个exe就可以在任何机器上直接运行了
解决了
是Release出来的库,你们可以看到相关dll都是发行版本的dll
只要将
C:\Windows\WinSiS下的如下文件复制出来…
├─Manifests
│      x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.30411.0_x-ww_71382c73.cat
│      x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.30411.0_x-ww_71382c73.manifest
│      x86_Microsoft.VC90.MFC_1fc8b3b9a1e18e3b_9.0.30411.0_x-ww_421e9f78.cat
│      x86_Microsoft.VC90.MFC_1fc8b3b9a1e18e3b_9.0.30411.0_x-ww_421e9f78.manifest
│     
├─Policies
│  ├─x86_policy.9.0.Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_x-ww_b7353f75
│  │      9.0.30411.0.cat
│  │      9.0.30411.0.policy
│  │     
│  └─x86_policy.9.0.Microsoft.VC90.MFC_1fc8b3b9a1e18e3b_x-ww_4ee8bb30
│          9.0.30411.0.cat
│          9.0.30411.0.policy
│         
├─x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.30411.0_x-ww_71382c73
│      msvcm90.dll
│      msvcp90.dll
│      msvcr90.dll
│     
└─x86_Microsoft.VC90.MFC_1fc8b3b9a1e18e3b_9.0.30411.0_x-ww_421e9f78
        mfc90.dll
        mfc90u.dll
        mfcm90.dll
        mfcm90u.dll
这样做安装程序就好做了!
复制到C:\Windows\WinSiS\
运行库:
msvcm90.dll
msvcp90.dll
msvcr90.dll
msvcm90d.dll
msvcp90d.dll
msvcr90d.dll
MFC库:
mfc90.dll
mfcm90.dll
mfc90u.dll
mfcm90u.dll
mfc90d.dll
mfcm90d.dll
mfc90ud.dll
mfcm90ud.dll
根据项目配置从中使用相应的版本。
http://www.lryc.cn/news/2413773.html

相关文章:

  • java移位操作_java 移位运算
  • 春节灯谜及答案
  • 探秘雀魂智能助手:majsoul_wrapper项目深度剖析
  • SQuirrel SQL Client数据库连接工具的配置与使用
  • 精品PHP实现的博客网站的设计与实现
  • android权限(permission)大全
  • 1kb病毒解决方案
  • u盘低级格式化数据怎么恢复,u盘低级格式化还能恢复吗
  • FBReader源码分析之序言篇
  • 百度搜索下拉框,下拉菜单怎么做?如何刷?
  • android 4.1.2 菜单键,无惊喜功能!Android 4.1.2系统更新内容详解
  • 什么是树莓派(Raspberry Pi)
  • HTC G14(G18)刷MIUI详细刷机教程
  • Windows系统丢失olepro32.dll文件导致程序异常的问题
  • [经验栈]C#中几种定时器(timer)的区别
  • 团队拓展--真人CS团队战游戏拓展
  • 智能ABC知多少?
  • linux 下怎么将可执行文件做成镜像 开机就能运行这个可执行文件,基于Linux源代码及Busybox源代码制作精简可启动内核镜像技术实验方法...
  • 码片序列-沃尔什函数-哈达玛矩阵详解
  • RedHat未注册yum解决方法
  • 【Struts2】【Struts2的OGNL表达式】
  • 手把手教你轻松实现listview下拉刷新
  • 《数字IC设计入门》(1)
  • 菜鸟浅谈对于Adapter及AdapterView的理解
  • CSS进阶之grid网格布局 (三):关于grid布局、grid-container属性、grid-items属性
  • 升级AndrOid4.3,三星S4升级Android 4.3系统后应用停止运行的解决办法图解
  • Ageia的PhsyX遭破 无需物理卡即可开启
  • PHP自学网:自学者的良师益友
  • GOM和GEE引擎黑屏不显示界面,装备地图怪物的解决方法
  • PHP Socket编程指南:从入门到精通