首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VC++ 2012:如何将来自version.inc的版本信息(单独维护)包含到.rc文件中

VC++ 2012:如何将来自version.inc的版本信息(单独维护)包含到.rc文件中
EN

Stack Overflow用户
提问于 2012-10-10 14:08:01
回答 1查看 14.7K关注 0票数 9

摘要:具有通过预处理宏在单独维护的version.inc中定义的版本细节.如何将宏值包含到资源版本定义块中?

我的version.inc文件存储在UTF-8中(即在本例中为纯ASCII )。它的全部内容如下(此处的APS_前缀与应用程序的实名有关,而不是与资源编译器生成的.aps文件相关):

代码语言:javascript
复制
#define APS_MAJORNUMBER          4
#define APS_MINORNUMBER          5
#define APS_BUILDNUMBER          0
#define APS_MODIFICATIONNUMBER   0
#define APS_BUILDEXT              "wx"
#define APS_DATEYEAR          2012
#define APS_DATEMONTH           10
#define APS_DATEDAY              4

Visual 2012 C++似乎比Visual 2010更加挑剔资源脚本文件(app.rc)。我注意到的第一件事是,当手动编辑它时,我必须保留UTF-16编码。你能确认一下吗?这方面有什么文件吗?

假设app.rc中的版本块如下所示:

代码语言:javascript
复制
/////////////////////////////////////////////////////////////////////////////
//
// 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 0x40004L
 FILETYPE 0x1L
 FILESUBTYPE 0x0L
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "040504b0"
        BEGIN
            VALUE "CompanyName", "TODO: <Company name>"
            VALUE "FileDescription", "TODO: <File description>"
            VALUE "FileVersion", "1.0.0.1"
            VALUE "InternalName", "app.exe"
            VALUE "LegalCopyright", "Copyright (C) 2012"
            VALUE "OriginalFilename", "app.exe"
            VALUE "ProductName", "TODO: <Product name>"
            VALUE "ProductVersion", "1.0.0.1"
        END
    END
    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x405, 1200
    END
END

在Visual的早期版本(2005和2010)中,我能够拥有这样的相关version.rc2

代码语言:javascript
复制
/////////////////////////////////////////////////////////////////////////////
//
// Version
//

#include "version.inc"

#define STR(value) #value
#define STRINGIZE(value) STR(value)
#define APS_FULLVERSION_STR \
  STRINGIZE(APS_MAJORNUMBER) "." \
  STRINGIZE(APS_MINORNUMBER) "." \
  STRINGIZE(APS_BUILDNUMBER) "." \
  STRINGIZE(APS_MODIFICATIONNUMBER)


VS_VERSION_INFO VERSIONINFO
 FILEVERSION APS_MAJORNUMBER,APS_MINORNUMBER,APS_BUILDNUMBER,APS_MODIFICATIONNUMBER
 PRODUCTVERSION APS_MAJORNUMBER,APS_MINORNUMBER,APS_BUILDNUMBER,APS_MODIFICATIONNUMBER
 FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
 FILEFLAGS 0x29L
#else
 FILEFLAGS 0x28L
#endif
 FILEOS 0x4L
 FILETYPE 0x1L
 FILESUBTYPE 0x0L
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "000004b0"
        BEGIN
            VALUE "Comments", "A fairly useful tool named APS"
            VALUE "CompanyName", "The company name"
            VALUE "FileDescription", "app"
            VALUE "FileVersion", APS_FULLVERSION_STR
            VALUE "InternalName", "aps"
            VALUE "LegalCopyright", "Copyright © 1993-" STRINGIZE(APS_DATEYEAR)
            VALUE "OriginalFilename", "app.exe"
            VALUE "PrivateBuild", ""
            VALUE "ProductName", "APS of the version 4"
            VALUE "ProductVersion", APS_FULLVERSION_STR
            VALUE "SpecialBuild", APS_BUILDEXT
        END
    END
    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x0, 1200
    END
END

然后,通过手工编辑version.rc2app.rc包含到app.rc中。但是,我不能在Visual 2012项目和资源文件中重复此过程。我可能是在做一些我看不见的错误。这种方法在Visual 2012中也适用吗?

谢谢你的时间和经验,

佩尔

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-12 08:09:39

下面是通过2012 (C++,IDE)实现该功能的方法。首先,似乎所有的文件(app.rcversion.rc2和要包含在app.rc中的版本部分,以及包含在version.rc2中单独维护的值的version.inc )都必须存储在UTF-16中--与Visual的早期版本不同。然后,我也可以在Visual 2012中重复同样的方法。

但是,您不需要手动编辑app.rc文件。可以使用IDE使用下列步骤:

  • 打开项目(App)并切换到“资源视图”选项卡。
  • 展开App项目,展开它的app.rc,展开Version文件夹。您可以看到VS_VERSION_INFO项。
  • 标记VS_VERSION_INFO项并在键盘上按下删除键。项目及其上Version文件夹消失。
  • 鼠标右键单击app.rc文件夹,并选择资源包含.出现具有相同名称和三个输入窗格的对话框。

  • 将注意力集中在名为编译时指令的底部窗格上,并在那里编写#include "version.rc2"。(该文件不能具有.rc扩展名,但.rc2很好,建议在MSDN的其他地方使用。)
  • 按OK,保存所有文件(也保存修改后的app.rc)。

这些步骤的结果是您将不会在资源树中看到Version文件夹和VS_VERSION_INFO项(请参见资源视图选项卡);但是,上述构造的Version部分(存储在version.rc2中)被编译到应用程序资源中。

从技术上讲,在这些步骤之后可以找到app.rc文件的以下部分:

代码语言:javascript
复制
3 TEXTINCLUDE 
BEGIN
    "#include ""version.rc2""\r\n"
    "\0"
END

..。

代码语言:javascript
复制
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
#include "version.rc2"

/////////////////////////////////////////////////////////////////////////////
#endif    // not APSTUDIO_INVOKED

欢迎任何有建设性的意见来加强这一主题,并将提供+1-ed :)

痛快地玩一下吧,

佩尔

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12821369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档