如何在两个Visual C++项目之间共享相同的产品版本?

9

我有两个Visual C++项目,它们都有一个RC文件,其中定义了“产品版本”字段。我该如何使这两个项目从全局位置获取此版本?全局RC文件或其他解决方案有哪些?


创建一个全局的 version.h 文件,并从两个 rc 文件中包含它。 - user1773602
我认为你只需要手动修改版本信息即可。 - Healer
@aleguna,你能举个例子说明version.h文件需要包含什么吗? - dbrasco
1
@donnib,请在任何文本编辑器(例如notepad.exe)中打开您的rc文件,并将版本部分剪切粘贴到version.h中。然后使用此方法https://dev59.com/3UXRa4cB1Zd3GeqPpzQi将`version.h`包含在rc文件中。 - user1773602
2个回答

11

对我来说有效的方法是添加两个“解决方案项”。一个是.h文件,其中定义了一些版本字符串,另一个是.rc文件,其中包含对.h的引用和使用这些定义的BLOCK“StringFileInfo”

每个项目的单独资源文件使用{{link1:TEXTINCLUDE}}将解决方案的.rc内容引入。

这需要理解很多。让我给你展示一下我的意思...

1)这两个解决方案项的添加方式如下:

Solution Items

2) version.h 中有一些 #define,将在 VersionInfo.rc2 中使用。

#define SOLUTIONFILEVERSION 1,00,0000,00000
#define SOLUTIONFILEVERSIONSTRING "1,00,0000,00000"
#define COPYRIGHT "Copyright 2012"
#define PRODUCTNAME "Your product name"
#define COMPANYNAME "Your company name"

3) VersionInfo.rc2 使用了定义

#include "version.h"
VS_VERSION_INFO VERSIONINFO
 FILEVERSION SOLUTIONFILEVERSION
 PRODUCTVERSION SOLUTIONFILEVERSION
 FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
 FILEFLAGS 0x1L
#else
 FILEFLAGS 0x0L
#endif
 FILEOS 0x4L
 FILETYPE 0x2L
 FILESUBTYPE 0x0L
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "040904b0"
        BEGIN
            VALUE "CompanyName", COMPANYNAME
            VALUE "FileVersion", SOLUTIONFILEVERSIONSTRING
            VALUE "LegalCopyright", COPYRIGHT
            VALUE "ProductName", PRODUCTNAME
            VALUE "ProductVersion", SOLUTIONFILEVERSIONSTRING
        END
    END
    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x409, 1200
    END
END

您需要在文件末尾添加一个新行,以便在下一步中包含资源编译器时使其正常工作。

另一个您可能想要设置的字段是“FileDescription”,但这通常是按项目设置的。请记住,它可以包含您希望在项目之间共享的任何内容。

4) 在每个进程中包含VersionInfo.rc2。这可以通过右键单击资源视图中每个项目的.rc文件并选择资源包含来完成。

添加到编译时指令中:#include "../VersionInfo.rc2"

Compile-time directives

这可以通过手动将以下内容添加到项目的.rc文件中来完成,但最好让Visual Studio尽可能地为您管理一切。

3 TEXTINCLUDE 
BEGIN
    "#include ""../VersionInfo.rc2""\r\n"
    "\0"
END

/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
#include "../VersionInfo.rc2"
/////////////////////////////////////////////////////////////////////////////

哇...这真是一大堆话。但现在你应该能够从一个地方更改你的产品版本。


非常感谢您。我尝试了您的建议,但它没有起作用。我创建了version.h文件并进行了定义,然后创建了VersionInfo.rc2并将其包含在项目的主RC文件中。我还将version.h和VersionInfo.rc2都添加到了项目中。您没有提到的一件事是从主RC文件中删除Version相关的内容。我也这样做了。构建项目时,我收到了警告/错误,并且dll中所有字段均为空,因此似乎版本信息没有通过。我不知道我错在哪里,我的IDE是Visual Studio 2009。 - dbrasco
1
你提到在每个项目中设置FileDescription。有任何建议吗?除了这个共享的文件之外,项目特定的.rc文件中是否可以有另一个“BLOCK“StringFileInfo”? - CoderDennis
1
我尝试添加第二个版本信息块,但是出现了预期的错误。仍在寻找一种包含项目特定值的方法。 - CoderDennis
你们有没有想过如何将这些rc文件添加到msbuild中以在teamcity上运行? - Ani
@Ani 我从未使用过Teamcity,但是按照这个答案的步骤,然后将msbuild指向您的.sln应该不会出现任何问题。 - Sean Cline

0

好的,我已经解决了。

我还必须在项目资源文件底部添加以下内容。

/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//

#include "VersionInfo.rc2"

/////////////////////////////////////////////////////////////////////////////

现在一切都很顺利。谢谢。


很高兴你已经解决了。我已经更新了我的答案的最后一步,希望能让其他人在以后跟随时更容易理解。 - Sean Cline

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接