如何获取dll文件的编译日期?

How get compiled date of a dll file?

我正在使用此代码来捕获可执行文件 (.exe) 的编译日期。我正在寻找一种解决方案来实现与 .dll 文件相同的效果。当此代码插入到 dll 项目中并且 injected/or 在某些可执行文件 (.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);

您的代码示例正在使用 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;