如何自动将构建日期变为我的代码可见的常量?

Dav*_*nan 20 delphi delphi-xe2

我想在我的代码中定义一个常量,保存可执行文件的构建日期.我自然希望自动化这个过程.

我知道我可以使用例如Perl编写预构建脚本来写出.inc包含日期的文件.我更喜欢使用环境变量或构建变量的更轻量级的解决方案.msbuild是否提供任何有用的变量?有谁知道这个问题的更简洁的解决方案?

Ond*_*lle 31

您可以从可执行文件的PE头读取链接器时间戳:

uses
  ImageHlp;

function LinkerTimeStamp(const FileName: string): TDateTime; overload;
var
  LI: TLoadedImage;
begin
  Win32Check(MapAndLoad(PChar(FileName), nil, @LI, False, True));
  Result := LI.FileHeader.FileHeader.TimeDateStamp / SecsPerDay + UnixDateDelta;
  UnMapAndLoad(@LI);
end;
Run Code Online (Sandbox Code Playgroud)

对于当前模块的加载图像,以下似乎有效:

function LinkerTimestamp: TDateTime; overload;
begin
  Result := PImageNtHeaders(HInstance + Cardinal(PImageDosHeader(HInstance)^._lfanew))^.FileHeader.TimeDateStamp / SecsPerDay + UnixDateDelta;
end;
Run Code Online (Sandbox Code Playgroud)

早期版本的Delphi没有正确更新它,但它已经在Delphi 2010左右修复.对于早期版本,我使用IDE插件在成功编译后自动更新它.

注意:该值存储为UTC,因此出于显示目的,您可能需要将其转换为适当的时区.

  • 大!您可以使用DateUtils例程转换为本地时间:`TTimeZone.Local.ToLocalTime()` (3认同)
  • 非常感谢.我不认为这是可能的.我很高兴我现在问! (2认同)
  • :-)欢迎,我很乐意提供帮助! (2认同)

ain*_*ain 9

如果您使用/拥有JCL,那么就会jclPEImage.PeReadLinkerTimeStamp()完成您所追求的目标.旧版本的Delphi没有设置链接器时间戳,但AFAIK新版本确实如此(即它似乎与D2010一起工作正常).


Uwe*_*abe 5

DDevExtensions可以选择将编译日期和时间包含在versioninfo资源中.我想我不必告诉你如何从程序中提取它...

更新关于自动构建:FinalBuilder有类似的选项.