Microsoft Visual C++ 程序的部署方法

1. 用Microsoft Visual C++ 6.0编译的程序,或者发布在Windows 2000/NT/ME/98 系统
单纯通过拷贝MSVCRxx.DLL文件到应用程序目录或system32目录即可

2. 用Visual Studio 2005以上编译的程序,且发布在Windows XP及以上系统
为了减少DLL引发的配置问题(DLL hell),C和C++运行时由并行 (Side-by-Side) 程序集实现,单纯通过拷贝MSVCRxx.DLL并不足以在非开发环境正常运行程序,必须通过一个清单(manifest)来加载CRT DLL。如果加载C运行时库时没有这个清单,会引发R6034异常。这就是为何CRT DLLs现在位于WinSXS(Windows Side-by-Side)而不在System32目录的原因。

EXE和DLL文件都会有一个manifest文件,里面说明了依赖关系,用Visual Studio 2005编译后,会自动产生与可执行文件同名的manifest文件,如:
app.exe                // 可执行文件
app.exe.manifest    // dll依赖文件
一般情况下,会把EXE和DLL的manifest文件嵌入到EXE和DLL文件中,外置的manifest就可以删除了。如:
mt.exe /nologo /manifest ".\app.exe.manifest" /outputresource:".\app.exe";1
在EXE文件中,最后面的值为1,在DLL文件中,值为2
Microsoft Visual C++运行库DLL文件中则没有嵌入manifest文件,因此需要外部的manifest文件,Visual Studio 2005的manifest名字叫Microsoft.VC80.CRT.manifest,Visual Studio 2008的manifest名字叫Microsoft.VC90.CRT.manifest,所以要将Microsoft.VC80.CRT.manifest,MSVCR80.dll,MSVCP80.dll,MSVCM80.dll 这四个文件拷贝到应用程序目录。如
C:\Test\app.exe
C:\Test\MSVCR80.dll
C:\Test\MSVCP80.dll
C:\Test\MSVCM80.dll
C:\Test\Microsoft.VC80.CRT.Manifest
或者采用Microsoft官方建议,如:
在WinXP以上
C:\Test\app.exe
C:\Test\Microsoft.VC80.CRT\Microsoft.VC80.CRT.manifest
C:\Test\Microsoft.VC80.CRT\msvcr80.dll
C:\Test\Microsoft.VC80.CRT\msvcp80.dll
C:\Test\Microsoft.VC80.CRT\msvcm80.dll
在Win2K以下
C:\Test\app.exe
C:\Test\msvcr80.dll
C:\Test\msvcp80.dll
C:\Test\msvcm80.dll
如果用以上方法还是不能执行,说明Microsoft Visual C++在系统中有多个版本的DLL,程序用到的和发布的Microsoft Visual C++ DLL不匹配,如:
app.Manifest 文件,要求Microsoft.VC90.CRT的DLL,并且版本为9.0.21022.8


代码如下:

<?xml version='1.0'encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level='asInvoker' uiAccess='false'/>
      </requestedPrivileges>
    </security>
  </trustInfo>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.VC90.CRT'version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b'/>
    </dependentAssembly>
  </dependency>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.Windows.Common-Controls'version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'/>
    </dependentAssembly>
  </dependency>
</assembly>

Microsoft.VC90.CRT.manifest文件,指明是Microsoft.VC90.CRT,但版本为9.0.30729.1

代码如下:

<?xml version="1.0"encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <noInheritable></noInheritable>
    <assemblyIdentity type="win32" name="Microsoft.VC90.CRT"version="9.0.30729.1" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    <file name="msvcr90.dll" hashalg="SHA1" hash="9785b1c493deb5b2134dc4aef3719cee207001bc"><asmv2:hash xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"><dsig:Transforms><dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity"></dsig:Transform></dsig:Transforms><dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></dsig:DigestMethod><dsig:DigestValue>VF5ECUAHPV7EnUf+/UIXMPizPvs=</dsig:DigestValue></asmv2:hash></file><file name="msvcp90.dll" hashalg="SHA1" hash="0f6bbf7fe4fb3fca2cb5b542eca1a1cad051f01c"><asmv2:hash xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"><dsig:Transforms><dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity"></dsig:Transform></dsig:Transforms><dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></dsig:DigestMethod><dsig:DigestValue>3Wg+StVMq2uhx7POnAkl2w4dDmY=</dsig:DigestValue></asmv2:hash></file><file name="msvcm90.dll" hashalg="SHA1" hash="7f3290ab2b7444c2b4a9b1fedfdb16466d7a21bb"><asmv2:hash xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"><dsig:Transforms><dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity"></dsig:Transform></dsig:Transforms><dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></dsig:DigestMethod><dsig:DigestValue>/YfRn7UQENzdMeoMHxTgdRMiObA=</dsig:DigestValue></asmv2:hash></file>
</assembly>

二者版本不一致,导致程序不能运行,解决办法是发布程序要求的9.0.21022.8版本的Microsoft.VC90.CRT文件

3. 还有一种简单办法是在需要部署的机器上安装Visual C++ 2008 Redistributable Package(x86)或者(x64)。

注:

用Dependency Walker(depends.exe)打开要发布的EXE,从左上角的列表中找出系统中需要依赖的DLL

(0)

相关推荐

  • VC6.0代码自动提示 VC6.0在win7环境下代码提示智能化

    作为程序猿的你,是否已经喜欢或习惯依赖IDE开发环境呢.作为Java程序猿,我还是蛮深深的依赖Java IDE开发环境滴,比如Eclipse或MyEclipse. 有了IDE环境,即使你想不起方法全名,只要知道某个前缀,或哪怕在提示列表中,一一查询,也可以找到自己想找的方法或属性.但是,若是IDE不这么智能,那你是否还能胜任吗? 目前小弟就遇到此情况.VC6.0环境,o(︶︿︶)o 唉,还是不能跟Eclispe相媲美的,也许是对VC6.0不熟悉,对Eclispe相对于熟悉,所以VC6.0使用起来

  • 在Visual Studio上构建C++的GUI框架wxWidgets的开发环境

    本文使用的Unicode+DLL+Debug的方式,因为不想最后生成的exe文件太大. 环境搭建步骤如下: 1.下载wxWidgets包: 登录wxWidgets的下载页面:http://www.wxwidgets.org/downloads 下载最新的Stable Release稳定版,我这里用旧的2.8.12版作演示. 2.将wxMSW-2.8.12.zip解压到D盘根目录下. 转到D:\wxMSW-2.8.12\build\msw目录,用VS2005打开wx.dsw,会有提示转换项目: 选

  • Microsoft Visual C++ 6.0开发环境搭建教程

    上一篇演示的是如何安装VS2010,本文演示的是如何安装Microsoft Visual C++ 6.0 简称VC6. 有同学经常VC6都是很古董的版本了,为啥他还存在,不得不说VC6是微软一个很经典的版本. 现在很多公司都还是采用这个开发环境,不过大多数同学们的系统可能已经是win7或者win8.1了,导致VC6奔溃. 本文演示的VC++6.0绿色版本不存在这样的问题. 1.绿色版,先解压缩VC++6.0绿色版, 2.然后打开  运行.bat 3.输入项目名称 4.选择hello world

  • VC6.0打开文件以及向工程中添加文件时程序崩溃自动退出解决方法

    换了一台电脑,vc6.0程序中,点击打开文件以及向工程中添加文件时,程序竟然崩溃自动退出了. 不知什么原因,安装相同的vc程序,本本竟然出现此缘故.但是这个操作又是自己经常用到的,所以不得不解决. 与上一台电脑不同的是,此电脑是win7系统,而上一个则是xp系统.此电脑office是2010版本,而上一个则是WPS:于是乎,在网上查资料,来解决. 看到网上也有类似的问题,有的说是win7系统原因,有的说是office2007版本缘故,有的说是viso缘故.总之,这几种说法,我都符合.win7系统

  • VC6.0如何创建以及调用动态链接库实例详解

    小弟在公司的职责,在上篇博客中已经简约介绍.这边博客主要介绍技术的应用而不在细究原理.因为公司项目着急,出结果要紧,并且咱也不是专注搞研究的,所以,基本懂了原理后,直接上手工作,搞出demo来最好. 至于公司工作情况,今天暂且略过,当然也不是一两句能够表达清楚的.后面会有相应的工作总结,敬请期待-- 现在,废话少说,直奔主题--VC6.0中创建动态链接库. 作为客户与后台的中介,为了更好的调节两方的关系,我明智滴选择了webservice以及动态链接库.在与客户c++使动态链接库方式,而与后台j

  • 在Visual Studio中用C++语言创建DLL动态链接库图文教程

    什么是DLL(动态链接库)? DLL是一个包含可由多个程序同时使用的代码和数据的库.例如:在Windows操作系统中,Comdlg32 DLL执行与对话框有关的常见函数.因此,每个程序都可以使用该DLL中包含的功能来实现"打开"对话框.这有助于促进代码重用和内存的有效使用.这篇文章的目的就是让你一次性就能了解和掌握DLL. 为什么要使用DLL(动态链接库)? 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有通用性,就可以将它构造成相对独立的功能模块并在之后的项目中重复

  • 在Visual Studio使用C++开发Metro应用

    Visual Studio 11 消费者预览版支持使用 C++ 创建 Metro 风格的应用程序,这对广大本地应用开发者来说是一个大消息.这里我们来创建一个非常简单的 Metro 应用. 启动 Visual Studio 并通过 Visual C++>Windows Metro Style>Blank Application 模板创建一个项目.  "Hello world" 打开 BlankPage.xaml 文件,滚动到代码底部并定位 Grid 元素,然后插入一个 Tex

  • Microsoft Visual C++ 程序的部署方法

    1. 用Microsoft Visual C++ 6.0编译的程序,或者发布在Windows 2000/NT/ME/98 系统单纯通过拷贝MSVCRxx.DLL文件到应用程序目录或system32目录即可 2. 用Visual Studio 2005以上编译的程序,且发布在Windows XP及以上系统为了减少DLL引发的配置问题(DLL hell),C和C++运行时由并行 (Side-by-Side) 程序集实现,单纯通过拷贝MSVCRxx.DLL并不足以在非开发环境正常运行程序,必须通过一个

  • 微信小程序的部署方法步骤

    部署环境: jdk1.7 mysql5.6 tomcat7 centos6.5 1资料准备 1)linux服务器,推荐使用阿里云,这里预算有限,所以使用了香港的低配服务器. 2)域名,这里是在阿里云平台上申请的,没有申请到cn,因为身份证信息和网上查询的有问题,我是转到学校的,所以没有审核通过.这里使用的是国际域名.通过审核才能用哈. 3)ac证书,这里也是在阿里云平台申请的,一年免费版,要绑定域名哈,这里直接使用最方便的针对tomcat的证书,人多的话就是用nginx哈.绑定了域名才能用哈.证

  • Python3安装模块报错Microsoft Visual C++ 14.0 is required的解决方法

    问题一:安装模块时出现报错 Microsoft Visual C++ 14.0 is required,也下载安装了运行库依然还是这个错误 解决: 1.打开Unofficial Windows Binaries for Python Extension Packages(http://www.lfd.uci.edu/~gohlke/pythonlibs/),这里面有很多封装好的Python模块的运行环境 2.找到所需要下载的模块文件对应版本进行下载. 如,需要下载Pymssql,本机安装是32位

  • K8s部署发布Golang应用程序的实现方法

    目录 创建dockerfile 打包并且推送 创建namespace 创建deployment 创建service 创建ingress 创建hpa alertGo程序可以参考上篇文章,主要用于alertmanager实现钉钉报警 创建dockerfile FROM golang:1.14-alpine ENV GOPROXY=https://goproxy.cn WORKDIR /build COPY . . EXPOSE 8088 RUN mkdir /app RUN go mod tidy

  • PHP小程序后台部署运行 LNMP+WNMP的方法

    目录 一.简介: 二.环境 1.Win 2.Linux + 微擎+小程序运行调试审核发布流程 宝塔安装相关软件 一.简介: 1.微信小程序后台,通常为PHP,或者JAVA版本,以下简单说下使用LNMP(Linux+Nginx+mysql+php)与WNMP(Win+Nginx+mysql+php) 2.该博文详细介绍后台部署到小程序编码提交版本到发布版本,请看后面部分: 二.环境 1.Win 通常win操作系统使用图形化界面一键部署,通常使用集成工具XAMPP与phpstudy_pro 1.XA

  • Microsoft Visual Studio 2017 for Mac Preview安装使用案例分享

    本文为大家详细介绍了Microsoft Visual Studio 2017 for Mac Preview 下载.安装.案例Demo 0. 前言: 工作原因,上下班背着我的雷神,一个月瘦了10斤,扛不住了,就把我的Mac放在公司. Mac之前为了运行VS,还买了一个PD虚拟机... 现在,我终于喝到鸡汤了--随着Visual Studio 2017的发布,for Mac的版本也诞生了! 下载地址大家可以去visualstudio官网下载,不过可能会有点儿慢,我上传了百度云.文章最后提供下载.

  • Microsoft Visual Studio 2010下如何添加命令提示行

    下面给大家介绍Microsoft Visual Studio 2010下添加命令提示行的方法,希望对大家有所帮助. 部分VS2010软件中不存在命令提示行选项,对于这种情况可以通过外部工具进行添加,步骤如下 工具->外部工具 打开外部工具后自行进行添加,参数如下 其中需要注意的是参数一栏 /k "D:\c#\VC\vcvarsall.bat" 参考本文配置的读者可根据各自VS2010的安装目录情况进行修改. 解决这个问题后即可打开VS下的命令行模式.

  • IIS开启GZIP压缩效率对比及部署方法小结

    压缩的最大好处就是降低了网络传输的数据量,从而提高客户端浏览器的访问速度.当然,同时也会增加一点点服务器的负担.GZIP是比较常见的一种HTTP压缩算法. 压缩测试在部署的IIS 6.0上配置了GZIP压缩,详细的测试结果如下.未开启GZIP压缩前,访问网站首页进行抓包分析.开启GZIP后,清空本地IE缓存,再次访问抓包分析.开启前后,页面大小减小了89213bytes,压缩掉原始大小的87%.当对CSS.JS等文件都开启GZIP压缩后,原21100bytes的文件,压缩后如图所示,压缩比为80

  • Django在Ubuntu14.04的部署方法

    第一步. sudo apt-get update sudo apt-get upgrade 先更新.. Django的主流部署方式:nginx+uwsgi+django 第二步,安装nginx sudo apt-get install nginx 安装nginx,如果需要安装最新的nginx需从官网下载源码包进行手动编译. nginx的大致文件结构. 1.配置文件:/etc/nginx 2.程序:/usr/sbin/nginx 3.日志:/var/log/nginx/access.log - e

  • visual studio 2012安装配置方法图文教程 附opencv配置教程

    在同学的帮助下,终于成功配置了vs+opencv,将详细过程记录在此,方便以后查阅 一.安装vs2012 下载vs2012,官方下载地址 1.双击安装文件,设置安装路径 2.选择需要的安装包 3.安装进行中 4.终于安装完成 5.点击启动 提示输入产品秘钥 YKCW6-BPFPF-BT8C9-7DCTH-QXGWC 激活成功 6.出现其它配置页面 这里选择C++为默认开发环境 7.启动   8.注意,有时可能出现兼容性问题,需要下载更新包 点击安装即可. 二.安装opencv 1.下载openc

随机推荐