如何增加在 Visual C++ 中的每个生成后的版本信息

原帖地址:http://support.microsoft.com/?id=237870

 

可以编写一个程序来修改资源编译器 (.rc) 文件,而不是此处使用上述步骤。 但是,RC 文件是受控于 Visual C++。 Visual C++ 修改保存,时 RC 的文件,并可能会影响版本资源。 本节中介绍的方法可以应用到任何 Visual C++ 项目。 此示例使用 Microsoft 基础类项目。

创建新项目使用 MFC (EXE) Appwizard 并调用它 MyProject 。 MyProject 需要了包含 MyProject.rc2 的 MyProject.rc 文件。 .rc2 文件意味着对于用户定义的资源。 请执行这些步骤以增加每个生成后 MyProject 的版本信息:

  1. 从.rc 文件中删除版本资源并将其置于.rc2 文件:

    1. 在文本编辑器中打开 MyProject.rc 和 MyProject.rc2 (位于 res 文件夹,)。 要使用 Visual C++ 编辑器,单击 文件 菜单上的 打开 ,然后选择 MyProject.rc 文件 另存为打开 列表中的 文本
    2. 找到版本资源语句 MyProject.rc 中。 它应当类似下面:
      /// 
      //
      // Version
      //

      VS_VERSION_INFO VERSIONINFO
      FILEVERSION 1,0,0,1
      PRODUCTVERSION 1,0,0,1
      FILEFLAGSMASK 0x3fL
      #ifdef _DEBUG
      FILEFLAGS 0x1L
      #else
      FILEFLAGS 0x0L
      #endif
      FILEOS 0x4L
      FILETYPE 0x1L
      FILESUBTYPE 0x0L
      BEGIN
      BLOCK "StringFileInfo"
      BEGIN
      BLOCK "040904b0"
      BEGIN
      VALUE "Comments", "Sample Application/0"
      VALUE "CompanyName", "Microsoft Corp./0"
      VALUE "FileDescription", "MyProject MFC Application/0"
      VALUE "FileVersion", "1, 0, 0, 1/0"
      VALUE "InternalName", "MyProject/0"
      VALUE "LegalCopyright", "Copyright (C) 1999/0"
      VALUE "OriginalFilename", "MyProject.EXE/0"
      VALUE "ProductName", "MyProject Application/0"
      VALUE "ProductVersion", "1, 0, 0, 1/0"
      END
      END
      BLOCK "VarFileInfo"
      BEGIN
      VALUE "Translation", 0x409, 1200
      END
      END
    3. 剪切 MyProject.rc 文件中的版本资源,并将其粘贴到下面注释在 MyProject.rc2 文件"添加手动编辑的资源"。 有关每个资源中字段的含义请参阅帮助中的 VERSIONINFO 资源声明。
  2. FILEVERSION 和 PRODUCTVERSION 数据替换 FILEVER 和 PRODUCTVER 的宏。 同样,替换宏 STRFILEVER 和 STRPRODUCTVER 文件版本和 ProductVersion 字符串数据。
  3. 添加 # VS_VERSION_INFO 资源语句之前的立即包括 VersionNo.h 。 现在看版本资源喜欢:
    /// 
    //
    // Version
    //
    #include "VersionNo.h"
    VS_VERSION_INFO VERSIONINFO
    FILEVERSION FILEVER
    PRODUCTVERSION PRODUCTVER
    FILEFLAGSMASK 0x3fL
    #ifdef _DEBUG
    FILEFLAGS 0x1L
    #else
    FILEFLAGS 0x0L
    #endif
    FILEOS 0x4L
    FILETYPE 0x1L
    FILESUBTYPE 0x0L
    BEGIN
    BLOCK "StringFileInfo"
    BEGIN
    BLOCK "040904b0"
    BEGIN
    VALUE "Comments", "Sample Application/0"
    VALUE "CompanyName", "Microsoft Corp./0"
    VALUE "FileDescription", "MyProject MFC Application/0"
    VALUE "FileVersion", STRFILEVER
    VALUE "InternalName", "MyProject/0"
    VALUE "LegalCopyright", "Copyright (C) 1997/0"
    VALUE "OriginalFilename", "MyProject.EXE/0"
    VALUE "ProductName", "MyProject Application/0"
    VALUE "ProductVersion", STRPRODUCTVER
    END
    END
    BLOCK "VarFileInfo"
    BEGIN
    VALUE "Translation", 0x409, 1200
    END
    END
  4. 创建名为您的项目在同一目录中的 VersionNo.h 一个标头文件。 此文件将包含以下语句在步骤 2 中使用的宏的定义:
    #define FILEVER        1,0,0,1
    #define PRODUCTVER 1,0,0,1
    #define STRFILEVER "1, 0, 0, 1/0"
    #define STRPRODUCTVER "1, 0, 0, 1/0"
    注意: 添加换行符和回车返回最后一行上的字符。

    现在,MyProject.rc 文件包括 MyProject.rc2,并 MyProject.rc2 文件包括 VersionNo.h。
  5. 使 用 Visual Basic 脚本宏将修改 VersionNo.h 文件内容。 宏下面介绍句柄,Visual C++ BuildFinish 事件以便它将不激发生成完成之前。 只要此 VB 脚本代码调用,首先增加在头文件的版本号固定的量,然后它会将文件保存并关闭它。 在随后的生成过程中可执行文件中包含新的版本号。

    安装和使用 VB 脚本代码,请执行下列操作:

    1. 打开现有的 DSM (宏) 文件或在 Visual C++ 中创建新 DSM 文件。 若要创建一个新的文件,单击 文件 菜单上的 新建 ,在 文件 选项卡上选择 宏文件 ,试一个的名称,单击 确定
    2. 粘贴以下 VB 脚本代码下面 (一个空的 DSM 文件无法安装在 Visual C++ ; 下一步介绍了安装):
      Function GetProjectDir(FullName)

      'VC++ doesn't provide any method for getting the path of the active project
      'See the VB Script reference for more information on the VB Script functions
      'used in this function

      Dim proj_path
      proj_path = Split(StrReverse(FullName),"/",-1,1)

      Dim count
      count = UBound(proj_path)

      Dim full_path
      full_path = ""
      Dim i

      for i = 1 to count
      full_path = full_path & "/" & proj_path(i)
      next

      GetProjectDir = StrReverse(full_path)

      End Function


      Sub ReplaceText(selection, count, incrementby)

      'selection represents the TextSelection object
      'count represents the position of the version number to be incremented
      'incrementby represents a number that will be added to the existing version number

      selection.WordRight dsMove, count
      selection.WordRight dsExtend, 1
      Dim str
      str = selection.Text
      str = str + incrementby

      selection.Text = str

      End Sub


      Sub Application_BuildFinish(numError, numWarning)

      'This event will be triggered after every build of a project
      'You can check numError and/or numWarning to determine if you want to continue
      'If numError <> 0 Then
      'exit sub
      'Obtain the full path of the active project
      Dim full_path
      full_path = GetProjectDir(ActiveProject.FullName)

      full_path = full_path & "versionno.h"

      'Open the VersionNo.h file
      Documents.Open full_path

      'Obtain the TextSelection object
      Dim selection
      set selection = ActiveDocument.Selection
      selection.StartOfDocument

      'Increment the version information
      ReplaceText selection, 9, 1
      selection.LineDown
      selection.StartOfLine
      ReplaceText selection, 9, 1
      selection.LineDown
      selection.StartOfLine
      ReplaceText selection, 10, 1
      selection.LineDown
      selection.StartOfLine
      ReplaceText selection, 10, 1

      ActiveDocument.Save
      ActiveDocument.Close

      End Sub
      注意: 此代码是一个不受支持的示例。 您可能会为您生成方案修改它。
    3. 如果没有已安装,请安装 DSM 文件。 要安装, 工具 菜单上单击 自定义 ,单击 加载项和宏文件 选项卡、 浏览以选择该 DSM 文件并单击 关闭
  6. 生成 菜单中选择 生成 MyProject.exe 。 生成完成后,打开 VersionNo.h 文件。 它将包含以下语句:
    #define FILEVER        1,0,0,2
    #define PRODUCTVER 1,0,0,2
    #define STRFILEVER "1, 0, 0, 2/0"
    #define STRPRODUCTVER "1, 0, 0, 2/0"
    如果您生成代码再次中, 此版本信息包含在的可执行文件并递增版本信息。 可以引入一些代码,在宏中上述以防止递增的版本号,如果生成产生错误。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值