摘要:通过预处理器宏在单独维护的version.inc
中定义版本详细信息...如何将宏值包含到资源版本定义块中?
我的version.inc
文件以UTF-8存储(例如,纯ASCII)。其完整内容如下(此处的APS_
前缀与应用程序的真实名称相关,而与资源编译器生成的.aps
文件无关:
#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 Studio 2010相比,Visual Studio 2012 C ++似乎对资源脚本文件(app.rc
)更加挑剔。我注意到的第一件事是,当手动编辑时,我必须保持UTF-16编码。你能证实吗?有没有关于那个的文件?
假设app.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 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 Studio(2005和2010)中,我能够像这样使用相关的version.rc2
:
/////////////////////////////////////////////////////////////////////////////
//
// 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.rc2
通过手动编辑app.rc
包含在app.rc
中。但是,我无法使用Visual Studio 2012项目和资源文件重复此过程。我可能会做一些我看不见的错误。该方法是否也适用于Visual Studio 2012?
感谢您的时间和经验,
彼得
答案 0 :(得分:12)
以下是通过Visual Studio 2012(C ++,IDE)完成此操作的方法。首先,似乎所有文件(app.rc
,version.rc2
的版本部分都包含在app.rc
,以及version.inc
中单独维护的值[包含在version.rc2
]中)必须以UTF-16 存储 - 与早期版本的Visual Studio不同。然后我也能在Visual Studio 2012中重复相同的方法。
但是,您无需手动编辑app.rc
文件。您可以使用IDE使用以下步骤:
App
)并切换到资源视图标签。App
项目,展开其app.rc
,然后展开Version
文件夹。您可以看到VS_VERSION_INFO
项目。VS_VERSION_INFO
项目并按下删除键。该项及其上部Version
文件夹消失。app.rc
文件夹,然后选择资源包含... 。出现具有相同名称和三个输入窗格的对话框。
#include "version.rc2"
。 (该文件不得包含.rc
扩展名,但.rc2
很好,并建议在MSDN文档的其他位置使用。)app.rc
)。步骤的结果是您不会在资源树中看到Version
文件夹和VS_VERSION_INFO
项目(请参阅资源视图标签);但是,上面提到的构造的Version
部分(存储在version.rc2
中)被编译到应用程序资源中。
从技术上讲,可以在以下步骤后找到app.rc
文件的以下部分:
3 TEXTINCLUDE
BEGIN
"#include ""version.rc2""\r\n"
"\0"
END
...
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
#include "version.rc2"
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED
欢迎提出任何建设性意见来加强这一主题,并且将进行+ 1-ed:)
度过愉快的时光,
彼得