【问题标题】:How get compiled date of a dll file?如何获取dll文件的编译日期?
【发布时间】:2021-10-05 01:50:06
【问题描述】:

我正在使用此代码来捕获可执行文件 (.exe) 的编译日期。我正在寻找一种对 .dll 文件实现相同功能的解决方案。当此代码插入 dll 项目并在某些可执行文件 (.exe) 中注入/或使用导出函数时,检索到的编译日期是可执行文件而不是 dll。

function GetExeBuildTime: TDateTime;
var
  LI: TLoadedImage;
{$IF CompilerVersion >= 26.0}
  m: TMarshaller;
{$IFEND}
  timeStamp: Cardinal;
  utcTime: TDateTime;
begin
{$IF CompilerVersion >= 26.0}
  Win32Check(MapAndLoad(PAnsiChar(m.AsAnsi(ParamStr(0)).ToPointer), nil, @LI,
    False, True));
{$ELSE}
  Win32Check(MapAndLoad(PAnsiChar(AnsiString(ParamStr(0))), nil, @LI,
    False, True));
{$IFEND}
  timeStamp := LI.FileHeader.FileHeader.TimeDateStamp;
  UnMapAndLoad(@LI);

  utcTime := UnixToDateTime(timeStamp);
  Result := TTimeZone.local.ToLocalTime(utcTime);
end;

用法:

FormatDateTime('dd/mm/yyyy', GetExeBuildTime);

【问题讨论】:

  • DLL 使用相同的 PE 格式,因此您可以以完全相同的方式找到 DLL 和 EXE 的构建日期
  • 请参阅this 以检索 DLL 的路径。

标签: date delphi dll delphi-10.3-rio


【解决方案1】:

您的代码示例使用ParamStr(0) 检索应用程序的可执行文件的路径,该文件传递给 MapANdLoad 函数以将可执行文件的 PE 映像加载到内存中。

您需要将ParamStr(0) 替换为您的 DLL 文件的文件位置,以便从您的 DLL 文件中检索此信息。

这里是您修改的函数,以便它接受可执行文件或 DLL 的路径作为输入参数。

function GetExeBuildTime(ExecutablePath: String): TDateTime;
var
  LI: TLoadedImage;
{$IF CompilerVersion >= 26.0}
  m: TMarshaller;
{$IFEND}
  timeStamp: Cardinal;
  utcTime: TDateTime;
begin
{$IF CompilerVersion >= 26.0}
  Win32Check(MapAndLoad(PAnsiChar(m.AsAnsi(ExecutablePath).ToPointer), nil, @LI,
    False, True));
{$ELSE}
  Win32Check(MapAndLoad(PAnsiChar(AnsiString(ExecutablePath)), nil, @LI,
    False, True));
{$IFEND}
  timeStamp := LI.FileHeader.FileHeader.TimeDateStamp;
  UnMapAndLoad(@LI);

  utcTime := UnixToDateTime(timeStamp);
  Result := TTimeZone.local.ToLocalTime(utcTime);
end;

【讨论】:

  • 提示:这未绑定到平台 - 您也可以使用此检查 32 位 EXE 中的 64 位 DLL。 OS/2 和 16 位 DLL/EXE 根本没有这样的时间戳。
猜你喜欢
  • 1970-01-01
  • 2011-07-09
  • 1970-01-01
  • 1970-01-01
  • 2010-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多