【问题标题】:How can I modify VS_VERSION_INFO from the cpp file如何从 cpp 文件修改 VS_VERSION_INFO
【发布时间】:2013-05-18 16:08:47
【问题描述】:

当我转到 资源视图 -> myproject.rc -> 版本 -> VS_VERSION_INFO 时,我可以更改字段。是否可以通过 cpp 文件更改这些字段?所以我可以使用类似的东西:

#define FileDescription "This is my program"

那会很酷,因为总是去那里更改这些字段很烦人。

【问题讨论】:

    标签: c++ visual-studio


    【解决方案1】:

    例如,在您的项目中创建一个名为“filever.rc2”的文件。

    filever.rc2 应该如下所示:

    #include "version.h"
    
    
    /////////////////////////////////////////////////////////////////////////////
    //
    // Version
    //
    
    VS_VERSION_INFO VERSIONINFO
     FILEVERSION VER_FILE_VERSION
     PRODUCTVERSION VER_PRODUCT_VERSION
     FILEFLAGSMASK 0x3fL
     FILEFLAGS VER_FILEFLAGS
     FILEOS VER_FILEOS
     FILETYPE VER_FILETYPE
     FILESUBTYPE 0x0L
    BEGIN
        BLOCK "StringFileInfo"
        BEGIN
            BLOCK "040904b0"
            BEGIN
                VALUE "CompanyName", VER_COMPANY_STR "\0"
                VALUE "FileDescription", "Your Application"
                VALUE "FileVersion", VER_FILE_VERSION_STR "\0"
                VALUE "InternalName", "Your"
                VALUE "LegalCopyright", VER_COPYRIGHT_STR "\0"
                VALUE "LegalTrademarks", VER_TRADEMARK_STR "\0"
                VALUE "OriginalFilename", "Your.exe"
                VALUE "ProductName", "Your Application"
                VALUE "ProductVersion", VER_PRODUCT_VERSION_STR "\0"
            END
        END
        BLOCK "VarFileInfo"
        BEGIN
            VALUE "Translation", 0x409, 1200
        END
    END
    

    “filever.rc2”中的信息是从项目的现有自动生成的 .rc 文件中复制并粘贴出来的。然后它被修改为使用定义的标识符。 #include "version.h" 将是定义的来源。该文件可以是您应用程序的一部分,您可以在其中从 Visual Studio 修改版本信息。

    在“version.h”文件中,添加如下内容:

    #define VERSION_YEAR        16  // 2 digit year
    #define VERSION_MONTH       4   // 2 digit month
    #define VERSION_DAY         22  // 2 digit day
    #define VERSION_UNSAFE      0   // 0 = TESTED, 1 = UNSAFE / IN DEVELOPMENT
    
    #define VER_COPYRIGHT_STR       "Copyright (C) 1999 - 2016"
    #define VER_TRADEMARK_STR       "Your Trademark"
    #define VER_COMPANY_STR     "Your Company"
    
    #define STRINGIZE2(s)               #s
    #define STRINGIZE(s)                STRINGIZE2(s)
    #if (VERSION_UNSAFE == 1)
        #define MY_VERSION_NUM          STRINGIZE(VERSION_YEAR) STRINGIZE(VERSION_MONTH) "." STRINGIZE(VERSION_DAY) STRINGIZE(VERSION_UNSAFE)
    #else
        #define MY_VERSION_NUM          STRINGIZE(VERSION_YEAR) STRINGIZE(VERSION_MONTH) "." STRINGIZE(VERSION_DAY)
    #endif
    #define VER_FILE_VERSION            VERSION_YEAR, VERSION_MONTH, VERSION_DAY, VERSION_UNSAFE
    #define VER_FILE_VERSION_STR        STRINGIZE(VERSION_YEAR) "." STRINGIZE(VERSION_MONTH) "." STRINGIZE(VERSION_DAY) "." STRINGIZE(VERSION_UNSAFE)
    #define VER_PRODUCT_VERSION         VER_FILE_VERSION
    #define VER_PRODUCT_VERSION_STR     VER_FILE_VERSION_STR
    #ifdef _DEBUG
        #define VER_VER_DEBUG           VS_FF_DEBUG
    #else
        #define VER_VER_DEBUG           0
    #endif
    #define VER_FILEOS                  VOS_NT_WINDOWS32
    #define VER_FILEFLAGS               VER_VER_DEBUG
    #define VER_FILETYPE                VFT_APP
    

    现在,转到资源浏览器,然后右键单击您正在处理的项目的资源文件夹。点击“资源包括”。

    添加:

    #include "filever.rc2" 到“只读符号指令”下的包含列表中。

    这会将filever.rc2 文件包含到资源文件中。单击确定。将出现有关进行更改的警告。点击确定继续进行更改。

    现在,浏览到资源文件中的“版本”文件夹。 打开该文件夹,右键单击版本条目,然后选择删除以删除版本条目。如果不删除,就会有重复的资源,因为我们在filever.rc2文件中添加了相同的信息,我们正在包含。

    版本信息现在将使用 filever.rc2 中包含的版本。这样它就不会自动生成了,如果它在项目资源文件中就是这种情况。

    从那时起,当您更改 version.h 中的常量并构建时,嵌入到可执行文件中的版本信息将来自 version.h 文件。

    此解决方案是之前帖子中描述的示例。希望这能阐明如何实施建议。

    我不确定 filever.rc2 文件中的 '.rc2' 扩展名有什么神奇之处,但我通过实验发现,如果您将其命名为 .rc,它会出现在资源浏览器中,但实际上并非如此可取的。如果你称它为 .h,它在 Visual Studio 中不能很好地编辑,因为它会尝试智能感知它,而且它看起来大多是错误的。称它为 .rc2 似乎让每个人都开心,不会造成副作用。

    干杯。

    【讨论】:

      【解决方案2】:

      您可以直接在文本编辑器中编辑资源文件 .rc 和 resource.h 文件。不过先关闭资源查看器。

      【讨论】:

        【解决方案3】:

        你不能。版本资源由链接器嵌入到您的 EXE 中,它不是变量。 Windows 知道如何找到它并在“属性”窗口中显示版本。试图用你的代码修改它在设计上没有用,当用户查看属性时它没有运行。您也不能修改自己的 EXE 文件,它在您的程序运行时被锁定。 UAC 阻止程序修改可执行文件,这是使 Roman 方法沉没的冰山。

        如果资源编辑器让您烦恼,您不必使用资源编辑器,.rc 文件只是一个文本文件,您可以使用文本编辑器进行编辑,就像您的 .cpp 源代码一样。并且预处理器首先对文件进行处理,您可以替换字符串,因此只需编辑 .h 文件,.rc 文件 #includes 也可以完成工作。

        【讨论】:

        • 我不确定您所说的“UAC 停止...”是什么意思。它不会停止,通过UpdateResource 对构建的二进制文件进行更新没有问题。只有在更新破坏了数字签名(完整性)时才会出现问题,在这种情况下,需要重新签署可执行文件才能修复它。
        • 我认为这个答案是多余的。最后一句话回答了OP的问题(但举个例子会更好);其余的不相关或不必要。
        • 不可能让每个人都开心 :( 回答完 10K 问题后再回来,我们会比较笔记。
        【解决方案4】:

        只需在 rc 文件中包含包含您的信息的标题:

        版本1.h:

        #define RELEASE_VER 1 // 0: beta version; 1: release version
        #define RELEASE_DATE "May 09 2013" // Mmm dd yyyy; only used for RELEASE_VER=1
        
        #define RELEASE_VER_MAIN  3 // version number (binary)
        #define RELEASE_VER_MAIN2 0
        #define RELEASE_VER_SUB   4
        #define RELEASE_VER_SUB2  0
        
        // version number (string)
        #define TOSTRING2(arg) #arg
        #define TOSTRING(arg) TOSTRING2(arg)
        #define RELEASE_VER_STR     TOSTRING(RELEASE_VER_MAIN)"."TOSTRING(RELEASE_VER_MAIN2)"."\
                                TOSTRING(RELEASE_VER_SUB)"."TOSTRING(RELEASE_VER_SUB2)
        

        myapp.rc

        #include "winver.h"
        #include "../../core/version1.h"
        
        /////////////////////////////////////////////////////////////////////////////
        //
        // Icon
        //
        1           ICON         "mayapp.ico"
        
        /////////////////////////////////////////////////////////////////////////////
        //
        // Version
        //
        
        1 VERSIONINFO
         FILEVERSION RELEASE_VER_MAIN,RELEASE_VER_MAIN2,RELEASE_VER_SUB,RELEASE_VER_SUB2
         PRODUCTVERSION RELEASE_VER_MAIN,RELEASE_VER_MAIN2,RELEASE_VER_SUB,RELEASE_VER_SUB2
         FILEFLAGSMASK 0x3fL
        #ifdef _DEBUG
         FILEFLAGS 0x1L
        #else
         FILEFLAGS 0x0L
        #endif
         FILEOS VOS_NT_WINDOWS32
         FILETYPE VFT_APP
         FILESUBTYPE 0x0L
        BEGIN
            BLOCK "StringFileInfo"
            BEGIN
                BLOCK "040904b0"
            BEGIN
                VALUE "Comments", "\0"
                VALUE "CompanyName", "Developed by xxx\0"
                VALUE "FileDescription", "mayapp super\0"
                VALUE "FileVersion", RELEASE_VER_STR
                VALUE "InternalName", "mayapp\0"
                VALUE "LegalCopyright", "Copyright (c) by my\0"
                VALUE "LegalTrademarks", "\0"
                VALUE "OriginalFilename", "mayapp\0"
                VALUE "PrivateBuild", "\0"
                VALUE "ProductName", "mayapp\0"
                VALUE "ProductVersion", RELEASE_VER_STR
                VALUE "SpecialBuild", "\0"
            END
        END
        BLOCK "VarFileInfo"
        BEGIN
            VALUE "Translation", 0x409, 1200
        END
        END
        

        【讨论】:

          【解决方案5】:

          您可以使用BeginUpdateResourceUpdateResourceEndUpdateResource API 修改已构建的二进制文件上的资源。

          如果您想自动更新,另一种选择是使用this tool,它封装了上述 API 并公开了脚本友好的 COM 接口。

          Image = new ActiveXObject(“AlaxInfoResourceTools.Image”);
          Image.Initialize(“C:\\Sample.dll”);
          WScript.Echo(“Product Version: ” + Image.VersionInfo.ProductVersionString);
          WScript.Echo(“File Version: ” + Image.VersionInfo.FileVersionString);
          var ProductName = Image.VersionInfo.GetString(0, “ProductName”);
          var OemProductName = Image.VersionInfo.GetString(0, “OemProductName”);
          WScript.Echo(“ProductName: ” + ProductName);
          WScript.Echo(“OemProductName: ” + OemProductName);
          Image.VersionInfo.SetString(0, “OemProductName”, “// ” + ProductName);
          Image.VersionInfo.Update();
          Image.EndUpdate(false);
          

          如果您自己构建,那么最简单的方法当然是直接修改资源脚本,或者使用 IDE 编辑器,或者直接在 .rc 文件中。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-04-04
            • 2021-06-01
            • 2010-10-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多