Delphi 版本号集中但其他信息分散

H.H*_*ack 7 delphi resource-files fileversioninfo rad-studio

背景

在 RS10.3 之前,我曾经使用 Andreas Hausladen DDevExtensions将我的项目源中的版本号设置为所有模块(bpl's/exe)都相同,但不幸的是,Andreas 已停止为 RS10.4 及更高版本更新他的工具。

因此,与使用 NotePad++ 对所有 dproj 文件应用多文件更改相比,我正在寻找更舒适的方法来在我的应用程序模块中设置版本号。

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

我还要什么喜欢但是,这不是一个真正的要求是有我的(C)的通知,和其他共享信息,以在一个文件中(最好是.RC)也可集中进行。

从 dproj 文件中删除版本信息(无论如何维护起来都很痛苦)并为每个模块提供一个特定的 .rc 文件不是问题。

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

调查

(随着我们的进行更新)我签出

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

所以这是Q

我如何拥有一个包含我的版本号的.rc 文件并在其他包含特定版本信息的 .rc 文件中使用它

H.H*_*ack 7

啊,我没想到它这么简单......我创建了两个 .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"
Run Code Online (Sandbox Code Playgroud)

和一个特定文件(对于每个具有不同名称和内容的模块,它会重新出现)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
Run Code Online (Sandbox Code Playgroud)

只需要创建这 2 个文件,将 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.
Run Code Online (Sandbox Code Playgroud)

我证实这有效。

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

有关 .rc 文件和示例的更多信息可以在MSDN上找到