我想在我的代码中定义一个持有可执行文件构建日期的常量。我当然希望自动化这个过程。
我知道我可以使用例如Perl编写一个预构建脚本来写出包含日期的.inc文件。我更喜欢使用环境变量或构建变量的更轻量级的解决方案。 msbuild是否提供任何有助于帮助的变量?有没有人知道这个问题的更好的解决方案?
解决方法
您可以从可执行文件的
PE header读取链接器时间戳:
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;
对于当前模块的加载映像,以下内容似乎有效:
function LinkerTimestamp: TDateTime; overload; begin Result := PImageNtHeaders(HInstance + Cardinal(PImageDosHeader(HInstance)^._lfanew))^.FileHeader.TimeDateStamp / SecsPerDay + UnixDateDelta; end;
Delphi的早期版本没有正确更新它,但它已经在Delphi 2010左右修复。对于早期版本,我在编译成功后自动更新了IDE plugin。
注意:该值存储为UTC,以便显示,您可能需要将其转换为适当的时区。