Delphi版本号居中显示,但其他信息分散。

8

背景

在RS10.3之前,我通常使用Andreas Hausladen的DDevExtensions 将我的项目源代码中的版本号设置为所有模块(bpl/exe)相同,但不幸的是,Andreas已经停止更新他的工具,因此在RS10.4及以后的版本中无法使用。

因此,我正在寻找更方便的方式来设置应用程序模块中的版本号,而不是对所有dproj文件进行多文件更改并使用NotePad++。

但是...另一方面,我确实希望保留特定信息(如文件描述等)针对模块文件。

我想要的另一个特性,但并非真正的要求,是将我的(c)声明和其他共享信息也集中到单个文件(最好是.rc文件)中。

删除dproj文件中的版本信息(这些文件本来就很难维护),并且每个模块都有一个特定的.rc文件是没有问题的。

另一个优点是,拥有一个中央版本号和(c)文件在svn变更管理方面也更好,因为我不必因为版本/构建号更改而提交每个.dproj文件。

调查研究

(随着我们的进展而更新):

但这些解决方案并不是我要寻找的真正方法;我正在寻找一种源文件/项目文件的方式来完成我的任务,而不是脚本。

因此,这是问题

我如何有一个单独的.rc文件包含我的版本号码,并将其用于其他包含特定版本信息的.rc文件?

1个回答

9
啊,我没想到这么简单... 我创建了两个.rc文件,一个包含共享信息的#defines SharedVersionDefs.rc:

#define VER_MAJ 1
#define VER_MIN 2
#define VER_SUB 3
#define VER_BUILD 8

#define VER_FILEVERSION             VER_MAJ,VER_MIN,VER_SUB,VER_BUILD
#define VER_FILEVERSION_STR         ""VER_MAJ,VER_MIN,VER_SUB,VER_BUILD"\0"

// in my app file and product version are the same
#define VER_PRODUCTVERSION          VER_MAJ,VER_MIN,VER_SUB,VER_BUILD
#define VER_PRODUCTVERSION_STR      ""VER_MAJ,VER_MIN,VER_SUB,VER_BUILD"\0"

#define VER_COMPANYNAME_STR "MyCompany\0"
#define VER_LEGALCOPYRIGHT_STR "(c) 2020 "VER_COMPANYNAME_STR"\0"

还有一个特定的文件(每个模块都会出现不同名称和内容)SpecificVersion.rc

/* Use the shared version info from a central file */
#include "SharedVersionDefs.rc"


#ifndef DEBUG
#define VER_DEBUG                   0
#else
#define VER_DEBUG                   VS_FF_DEBUG
#endif

VS_VERSION_INFO VERSIONINFO
FILEVERSION     VER_FILEVERSION
PRODUCTVERSION  VER_PRODUCTVERSION

BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "040904E4"
        BEGIN
            VALUE "CompanyName",      VER_COMPANYNAME_STR
            VALUE "FileDescription",  "Specific file description"
            VALUE "FileVersion",      VER_FILEVERSION_STR
            VALUE "InternalName",     "Specific internal name"
            VALUE "LegalCopyright",   VER_LEGALCOPYRIGHT_STR
            VALUE "ProductName",      "LCCAMQM"
            VALUE "ProductVersion",   VER_PRODUCTVERSION_STR
        END
    END

    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x409, 1252
    END
END

只需要创建这两个文件,将Delphi dproj文件中的版本信息设置为OFF,然后将特定的.rc文件添加到我想要它出现的模块的dproj中,本例中是一个较小的Delphi项目。
program VersionInfoTest;

{$R 'SpecificVersion.res' 'SpecificVersion.rc'}

uses
  Vcl.Forms,
  uMain in 'uMain.pas' {frmMain},
  uVerinfo in 'uVerinfo.pas';

{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TfrmMain, frmMain);
  Application.Run;
end.

而且我验证了这个有效。

注意:由于 RSP-13486,您需要将.rc文件添加到.dproj文件中。只需使用IDE将其拖放到其中即可。

有关.rc文件和示例的更多信息,请参阅MSDN


当其中一个值超过一位数时,这个对我来说会失败。 - FredS
@FredS 这很奇怪,在我的应用程序中,版本号(现在是4位数字)完全正常。(对于VER_BUILD定义) - H.Hasenack
当我在Visual Studio中打开RES文件时,我看到“StringFileInfo”中的FileVersion和ProductVersion条目都为。属性对话框正确显示了FileVersion,但由于“StringFileInfo”中的此条目不是必需的,因此我认为它只是默认值。 ProductVersion在属性中显示为 - FredS
@FredS 这很有可能,我没有尝试。我的主要兴趣是在一个单一的文件中存储版本号,以供我的 "无数个" bpl 使用。 - H.Hasenack
@FredS 我会使用 http://www.angusj.com/resourcehacker/ 检查我的输出 DLL、BPL 和 EXE 的所有资源。如果我有时间,我会去检查一下。实际上,我并没有检查 .res 文件本身。 - H.Hasenack
1
看起来brcc在关于定义方面有bug。你不能在VER_FILEVERSION_STR中重新使用VER_MAJ等定义,而必须直接将它定义为字符串(从而复制版本号)。 - H.Hasenack

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