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

来源:互联网 发布:关闭 搜索合作网络 编辑:程序博客网 时间:2024/04/29 11:09
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
根据项目配置从中使用相应的版本。
0 0
原创粉丝点击