You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取DLL文件的编译日期?现有EXE编译日期代码在DLL内调用返回宿主EXE时间

问题根因

你现有代码返回EXE编译时间的核心原因是:代码固定使用ParamStr(0)作为读取路径,而该参数永远返回当前进程主模块(启动进程的EXE文件)的路径,和代码所在的DLL无关。

解决方案1:获取当前DLL自身的编译时间

不需要读取磁盘文件,直接从内存中已加载的DLL模块头读取时间戳,性能更高:

function GetSelfDllBuildTime: TDateTime;
var
  pDosHeader: PImageDosHeader;
  pNtHeaders: PImageNtHeaders;
  timeStamp: Cardinal;
  utcTime: TDateTime;
begin
  // HInstance在Delphi DLL项目中默认为当前DLL的模块句柄
  pDosHeader := PImageDosHeader(HInstance);
  pNtHeaders := PImageNtHeaders(PByte(HInstance) + pDosHeader._lfanew);
  timeStamp := pNtHeaders.FileHeader.TimeDateStamp;

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

解决方案2:通用版,获取任意指定路径的EXE/DLL编译时间

如果需要读取外部DLL/EXE的编译时间,将路径作为参数传入即可:

function GetModuleBuildTime(const FilePath: 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(FilePath).ToPointer), nil, @LI, False, True));
{$ELSE}
  Win32Check(MapAndLoad(PAnsiChar(AnsiString(FilePath)), nil, @LI, False, True));
{$IFEND}
  timeStamp := LI.FileHeader.FileHeader.TimeDateStamp;
  UnMapAndLoad(@LI);

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

如果要在DLL中用这个通用版获取自身编译时间,先获取DLL自身的文件路径再传入即可:

function GetSelfDllPath: string;
var
  Buf: array[0..MAX_PATH] of Char;
begin
  GetModuleFileName(HInstance, Buf, MAX_PATH);
  Result := string(Buf);
end;

// 调用示例
// DllBuildTime := GetModuleBuildTime(GetSelfDllPath);

使用方式

和原代码一致,直接格式化返回的TDateTime即可:

// 读取自身DLL编译时间
FormatDateTime('dd/mm/yyyy', GetSelfDllBuildTime);
// 读取指定路径DLL编译时间
FormatDateTime('dd/mm/yyyy', GetModuleBuildTime('C:\test\test.dll'));

内容的提问来源于stack exchange,提问作者user13342561

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 00:42:00