现在的位置: 首页 > 综合 > 正文

VS2005 解决”应用程序配置不正确,程序无法启动”问题

2018年02月09日 ⁄ 综合 ⁄ 共 4438字 ⁄ 字号 评论关闭

版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明

http://xingzhesun.blogbus.com/logs/27746345.html

最近使用VS2005+codejock开发,需要做一个Release版本。当我把必要的mfc库,拷贝到exe目录下时。exe还是不能启动。

 经过网上查找,看到一篇文章。“解决"应用程序配置不正确,程序无法启动"”

URL :http://www.cnblogs.com/wuhanhoutao/archive/2008/01/09/1031928.html

于是乎。我按照文章所讲的,将dl和mainfest文件。统统从VS2005的redis文件下,拷贝到exe目录下。

呵呵,居然exe可以运行了。

但是:1.肯定有些dll是当前exe不需要的。还需要将之删除。

         2.manifest也许是必须的一个文件。

这篇文章是这样讲的。

在使用 VC++2005环境下生成的程序,放置到未安装VC环境的机器下后,有时候会出现程序无法执行的错误,其提示是:应用程序配置不正确,程序无法启动,重新安装应用程序可能解决问题。

      实际上,重装是解决不了问题的,解决的一种方法是查看*exe.intermediate.manifest文件,比如文件的内容是:

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>

<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>

 <dependency>

    <dependentAssembly>

      <assemblyIdentity type='win32' name='Microsoft.VC80.CRT' version='8.0.50727.762' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />

    </dependentAssembly>

 </dependency>

 <dependency>

    <dependentAssembly>

      <assemblyIdentity type='win32' name='Microsoft.VC80.MFC' version='8.0.50727.762' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />

    </dependentAssembly>

 </dependency>

 <dependency>

    <dependentAssembly>

      <assemblyIdentity type='win32' name='Microsoft.VC80.DebugCRT' version='8.0.50727.762' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />

    </dependentAssembly>

 </dependency>

</assembly>

       需要注意这个文件中的3个关键词:Microsoft.VC80.CRT,Microsoft.VC80.MFC和Microsoft.VC80.DebugCRT。寻找到...."Program Files"Microsoft Visual Studio 8"VC"redist文件夹下面,找到这些名称的子文件夹,拷贝它们下面所有的文件到希望发布的EXE文件下面,一起打包。这些文件也就是mfc80.dll,msvcr80.dll,msvcp80.dll和Microsoft.VC80.CRT.manifest等。此错误发生的原因是在目标机器上需要这些文件的支持。

 

“应用程序配置不正确,程序无法启动”的解决方法资料收集
2009年04月25日 星期六 7:24 P.M.

先鄙视一下百度空间的编辑器,实在是太差了,在word编辑的东西,拷贝到这里就成这个丑样了......

参考资料

1、VS2005解决"应用程序配置不正确,程序无法启动"问题

2、VS2005安装文件
"由于应用程序配置不正确,应用程序未能启动"

3、Microsoft
Visual C++ 2008发布程序的部署问题

4VC编写的程序不能在其他机器上运行的解决方案

新增(先看看上面的4个链接之后,遇到问题之后再看下面的几个链接)

5关于vs2008
sp1 C++生成的 manifest中运行库版本号的问题
 (推荐1)

6、在VC++2008的项目中,如何显示地指定要使用的C++库的版本? (推荐2)

7、VC9
SP1 generates manifests with the wrong version number

ps:有人认为这是一个bug,并汇报到ms网站上,但“推荐1”认为这不是一个bug

8、VC
Runtime Binding...
(ms的官方blog对这个问题的解释)

关于VC运行时绑定(上面链接的中文翻译)

9、部署
(C++)
推荐,比较难看懂

关于链接9下几个比较有用的链接:

程序集搜索顺序英文,主要讲的是CRT、MFC等的DLL和manifest文件的部署方式

选择部署方法

使用 Program Files\Microsoft Visual Studio 8\VC\Redist目录中提供的文件将特定 Visual
C++程序集作为应用程序的私有程序集安装。允许没有管理员权限的用户安装应用程序或可以通过共享运行应用程序时,建议使用这种方法。有关示例,请参见
如何:使用
XCopy进行部署
。(摘自:选择部署方法

总结如下:

使用vs2008/vs2008开发的程序有2种部署方法:共享并行程序集和私有程序集部署方法

所谓的共享并行程序集部署方法是指程序依赖的CRTMFCATLDLL和manifest文件位于目标机器上的c:\windows\winsxs目录中,发布程序的时候只需要将程序拷贝到目标机器上就可以了私有程序集部署方法指的是发布程序程序的时候,将所依赖的crt、mfc、atl的dll放在程序的当前目录下

对于release版程序

比较的简单的方法采用共享程序集的方式来部署,安装vcredist.exe (Microsoft
Visual C++ 2008 SP1 Redistributable Package (x86
)

也可以采用下面debug程序的私有程序集的部署方法

对于debug版本程序

◆ 若目标机器安装了VS开发环境(vs2005
sp1/vs2008 sp1)
,则在机器上同时也安装了共享并行程序集,包含各个版本的dll(8.0、9.0版本,位于C:\Windows\Winsxs目录下),则不需做任何的部署,直接将需要发布的程序拷贝到目标机器上就可以了,这和release版程序的发布方式是一样的

◆ 在没有安装VS开发环境(安装了vs2005
sp1/vs2008 sp1)的机器上,只能采用私有程序集的方式来部署
(因为vcredist.exe只安装了release版的CRT、MFC、ATL的DLL和manifest文件,没有对应的debug版本)

已知的2种方法:(针对vs2008 sp1,安装了sp1之后,在系统上会存在两个版本的CRT、MFC、ATL的DLL:9.0.21022.89.0.30729.1

1、使当前程序的manifest文件中依赖项的版本与vc安装目录下的redist目录下的dll的版本一致,均为9.0.30729.1

方法:

a、在编译项目时定义一个符号_BIND_TO_CURRENT_VCLIBS_VERSION,该符号定义于C:\Program Files\Microsoft Visual Studio 9.0\VC\include\crtassem.h 文件中(假设VC安装在c盘),这样使得编译后的程序的manifest依赖于CRT 9.0.30729.1版本(同样的,对于MFC也应该定义一个类似的符号,大家可以自己在VC的include目录下搜索“9.0.30729.1”或“9.0.21022.8”,就可以找到对应的定义该符号的头文件)

b、通过外部工具修改生成的exe或dll中manifest文件(好像windows sdk中的mt.exe可以做到,不过关于这个工具的资料十分的少)

2、将VC安装目录下的redist目录下(C:\Program
Files\Microsoft Visual Studio 9.0\VC\redist)
的Microsoft.VC90.CRT拷贝到要发布的程序的当前目录下,修改Microsoft.VC90.CRT目录中的Microsoft.VC90.CRT.manifest文件中的版本号,改成9.0.21022.8,这样使得程序误以为该目录下的vc的dll版本是9.0.21022.8(实质上仍然是9.0.30729.1版本)

说明:

1、链接4 的说法是错误的,根据我自己的实验,如果采用私有程序集的部署方法,必须保证manifest文件中的版本号都是相等的,不存在要发布的程序的manifest文件中的版本号大于等于依赖项(CRT、MFC、ATL的dll)的版本号的说法

2、采用共享并行程序集部署方式发布的程序,会自动根据所谓的“policy”(位于C:\WINDOWS\WinSxS\Policies目录下)进行跳转(由低版本号向高版本号跳转);例如程序中的manifest的版本号为9.0.21022.8而实际上程序是用vc2008
sp1编译的
(版本号为9.0.30729.1,在程序实际执行的时候,会根据

x86_policy.9.0.Microsoft.VC90.DebugCRT_1fc8b3b9a1e18e3b_x-ww_037be232目录下的9.0.30729.1.policy文件可以用记事本打开该文件中的内容选择9.0.30729.1版本的debugCRT

我个人推荐的阅读顺序:① 先看前面的4个链接,大致有点印象,知道什么是manifest、如何查看manifest文件的内容(能力强的话,也可以自己编写manifest文件)、在vc中如何查看编译过程中生成的manifest文件内容、知道C:\WINDOWS\WinSxS\目录是干什么的、知道vcredist.exe这个程序; 
再尝试着看看
链接7、8、9,这些链接的文章内容十分的晦涩,有的还是英文的,需要有点耐心看; ③ 最后仔细的看看链接5、6,并多多试验(特别推荐链接5,这个链接中的内容十分的详细)

http://www.360doc.com/content/11/0801/16/417496_137191539.shtml

谢谢该文章的作者。

抱歉!评论已关闭.