如何获取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;
我正在使用此代码来捕获可执行文件 (.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;