c++ - 如何从 cpp 文件修改 VS_VERSION_INFO

标签 c++ visual-studio

当我转到 Resource View -> myproject.rc -> Version -> VS_VERSION_INFO 时,我得到了可以更改的字段。可以通过 cpp 文件更改这些字段吗?所以我可以使用类似的东西:

#define FileDescription "This is my program"

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

最佳答案

例如,在您的项目中创建一个名为“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文件中添加了相同的信息,我们是include的。

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

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

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

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

干杯。

关于c++ - 如何从 cpp 文件修改 VS_VERSION_INFO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16626329/

相关文章:

vb.net - 确定 .net 程序何时编译/构建的任何方法

c# - 脚手架 Controller 不适用于 Visual Studio 2013 更新 3 和 4

c# - Visual Studio 应用程序中的解决方案中缺少某些 NuGet 包

c# - 如何捕获 system.xml.xml 异常

c++ - push_back 非指针元素到一行中的 vector

c++ - C++ 中的单元测试

c++ - 如果没有c++编译器,C语言可以调用c++编写的DLL吗?

c++ - 通过在 C++ 中表示类名的字符串创建新对象

c++ - 指针和 C 风格数组变量的专用模板

sql-server - SQL 结果中的字体大小到 Visual Studio 中的 GridView