如何获取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
相关产品推荐
相关产品推荐

