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

2016-02-19 10:30 35 1 收藏

下面图老师小编要向大家介绍下Microsoft Visual C++ 程序的部署方法,看起来复杂实则是简单的,掌握好技巧就OK,喜欢就赶紧收藏起来吧!

【 tulaoshi.com - 编程语言 】

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目录的原因。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

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:Testapp.exe
C:TestMSVCR80.dll
C:TestMSVCP80.dll
C:TestMSVCM80.dll
C:TestMicrosoft.VC80.CRT.Manifest
或者采用Microsoft官方建议,如:
在WinXP以上
C:Testapp.exe
C:TestMicrosoft.VC80.CRTMicrosoft.VC80.CRT.manifest
C:TestMicrosoft.VC80.CRTmsvcr80.dll
C:TestMicrosoft.VC80.CRTmsvcp80.dll
C:TestMicrosoft.VC80.CRTmsvcm80.dll
在Win2K以下
C:Testapp.exe
C:Testmsvcr80.dll
C:Testmsvcp80.dll
C:Testmsvcm80.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:Transformsdsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity"/dsig:Transform/dsig:Transformsdsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/dsig:DigestMethoddsig:DigestValueVF5ECUAHPV7EnUf+/UIXMPizPvs=/dsig:DigestValue/asmv2:hash/filefile 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:Transformsdsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity"/dsig:Transform/dsig:Transformsdsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/dsig:DigestMethoddsig:DigestValue3Wg+StVMq2uhx7POnAkl2w4dDmY=/dsig:DigestValue/asmv2:hash/filefile 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:Transformsdsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity"/dsig:Transform/dsig:Transformsdsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/dsig:DigestMethoddsig: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

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

来源:https://www.tulaoshi.com/n/20160219/1594876.html

延伸阅读
随着计算机信息表示及实现的多媒体化,在许多学习软件、游戏软件,以及多媒体课件制作软件中,经常使用各种图形显示技巧,如图形的推拉、交错、雨滴状、百页窗、积木随机堆叠等显示模式。这样使画面变得更为生动活泼,更能吸引用户,也为更好地发挥软件的功能奠定了基础。本文就Visual C++ 6.0中实现图形的各种显示技巧的原理及具体方法做...
标准(窗口)消息:窗口消息一般与窗口内部运作有关,如创建窗口,绘制窗口,销毁窗口,通常,消息是从系统发到窗口,或从窗口发到系统。发送函数SendMessage()或者PostMessage()。除WM_COMMAND之外,所有的以WM_开头的消息。从CWnd派生的类,都可以接受到这类消息。注意:标准消息并不需要我们指定处理函数名称,是默认的对应关系。 宏名称 对...
滚动视窗在应用程序中十分有用,它可以使用户看到比显示器屏幕还大的窗口。下面有一个建立滚动视窗的实例,在该例中,不仅滚动条会与视窗相连,而且HOME、PAGE DOWN、PAGE UP和END方向键会与视窗相连。现将本例中需用到的函数和类作一些必要的说明。 CscrollView类:它是从Cview类派生出来的,可以支持窗口的滚动。 GetsystemMetrics函数:...
   传递到目标硬件上的应用程序的形式为Symbian安装系统(。sis)文件。。sis文件是一个压缩的存档文件,它包含了安装所需要的所有文件,还包括了安装过程的选项信息。Symbian安装系统为把应用程序、数据或配置信息安装到基于Symbian操作系统的设备上提供了简单的和一致的用户界面。开发者(或最终用户)安装的组件都包含在。sis文件...
Microsoft Developer Studio为大多数标准的数据库格式提供了32位ODBC驱动器。这些标准数据格式包括有:SQL Server、Access、Paradox、dBase、FoxPro、Excel、Oracle以及Microsoft Text。如果用户希望使用其他数据格式,则需要安装相应的ODBC驱动器及DBMS。 用户使用自己的DBMS数据库管理功能生成新的数据库模式后,就可以使用ODBC来登录...

经验教程

53

收藏

94
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部