Visual Studio 2005 编译的版本无法启动,出现应用程序配置不正确的错误

原帖来自:http://www.zzzj.com/html/20080829/64942.html

 

这个问题最终的解决方法是修改manifest文件,首先需要关闭MSVC project中的embed manifest的选项,然后修改manifest文件。

修改前的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.50608.0" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b">assemblyIdentity>
    dependentAssembly>
  dependency>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC80.MFC" version="8.0.50608.0" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b">assemblyIdentity>
    dependentAssembly>
  dependency>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="x86" publicKeyToken="6595b64144ccf1df" language="*">assemblyIdentity>
    dependentAssembly>
  dependency>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.6195" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b">assemblyIdentity>
    dependentAssembly>
  dependency>
assembly>

 

修改后的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.50608.0" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b">assemblyIdentity>
    dependentAssembly>
  dependency>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC80.MFC" version="8.0.50608.0" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b">assemblyIdentity>
    dependentAssembly>
  dependency>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="x86" publicKeyToken="6595b64144ccf1df" language="*">assemblyIdentity>
    dependentAssembly>
  dependency>
assembly>

 

把最后的8.0.50727.6195版本的依赖删掉了。经实测:修改后可以在winxp和windows 8.1上运行。估计根本原因是因为这个程序引用到一些三方的DLL,而这些DLL的编译版本跟我这边所用的2005不一样(可能是很老的6.0)。不过就像原帖所说的,已经无法验证了。

 

附上原帖内容:

在网上找出了这些方法: 

方法一: 
在类似C:\Program Files\Microsoft Visual Studio 8\VC\redi 
st\Debug_NonRedist\x86\Microsoft.VC80.DebugCRT 下找到了下列文件: 

msvcm80d.dll 
msvcp80d.dll 
msvcr80d.dll 
Microsoft.VC80.DebugCRT.manifest 

把这几个文件拷贝到目标机器上,与运行程序同一文件夹或放到system32下,就可以正确运行了。 

其他release版、MFC程序什么的都是拷redist下相应文件夹下的文件就可以了,文件夹后都有标识! 

方法二: 
修改编译选项,将/MD或/MDd 改为 /MT或/MTd,这样就实现了对VC运行时库的静态链接,在运行时就不再需要VC的dll了。 

方法三: 

工程-》属性-》配置属性-》常规-》MFC的使用,选择“在静态库中使用mfc” 
这样生成的exe文件应该就可以在其他机器上跑了。 

方法四: 

你的vc8安装盘上找到再分发包vcredist_xxx.exe和你的程序捆绑安装 

在大部分机上都可以运行了,唯独在我的测试机上还是报应用程序配置错误。刚开始怀疑是还缺少dll,在能跑的机上把windows/system32目录下所有的msvc*.dll都复制到这台机的运行目录,还是不行!极度郁闷※×…!后来实在没辙了,就在VC环境中打开了EXE来查看它内嵌的manifest资源,无奈了看了一会,带着心中对manifest的咒骂,突然发现这个manifest带了两个版本CRT的依赖: 





再打开Microsoft.VC80.CRT.manifest一看,是这样: 



就是说,我们EXE的Manifest里多了一个版本依赖,那就把后面那个依赖删除试试。于是就把工程设置的生成manifest的选项去掉,手工改了一下manifest放到程序目录下,发现果然可以运行了! 

还有个问题没有明白,就是VC为什么在自动生成的manifest里带了两个依赖呢,上网再查了一下,发现在msdnonline上说'8.0.50608.0'这个版本是在XP下用的,'8.0.50727.762'这个版本是在Vista下用的(http://msdn.microsoft.com/en-us/library/ms235342(VS.80).aspx),可是我用的是'8.0.50727.762'在XP下运行的好好的!想不通是它错了还是别的原因。后来在CRT的源码里面搜索'8.0.50727.762',找到了~'8.0.50608.0'也在那里。 

#if defined _USE_RTM_VERSION 

#define _CRT_ASSEMBLY_VERSION “8.0.50608.0” 

#else 

#define _CRT_ASSEMBLY_VERSION “8.0.50727.762” 

#endif 

显然默认的版本是“8.0.50727.762”,除非定义了_USE_RTM_VERSION!那为什么我们的工程会生成两个版本的依赖呢,明明这个地方是二选一的。一开始怀疑是工程设置引起的,我就把我们的工程拷出来,把里面的文件删掉,再复制一些向导生成的文件进来,编译一看,manifest里只有一个'8.0.50727.762',说明工程设置没有问题!最后我怀疑是工程链接的那些库的问题,因为有些库是用VC6或者VC2003编译的,但是有些库没有代码,编不了,没法尝试了。

转载于:https://www.cnblogs.com/ezhang/p/3888183.html

你可能感兴趣的:(操作系统)