Also, ich hatte das gleiche Problem. Wollte nicht auf das Erstellt-Datum zurückgreifen, wegen der leichten Möglichkeit der Änderung.
Ich greife auf den
PE-Header zurück. In diesem steht ein Time Date Stamp.
Den kann man mit
Delphi-Quellcode:
procedure UpdateLinkerTimeStamp(const FileName: string; const Time: TDateTime);
var
LI: _LOADED_IMAGE; //TLoadedImage;
begin
Win32Check(MapAndLoad(PChar(FileName), nil, @LI, False, False));
LI.FileHeader.FileHeader.TimeDateStamp := Round((Time - 25569 {entspr. UnixDateDelta}) * SecsPerDay);
UnMapAndLoad(@LI);
end;
setzen. Ich weiß nicht, wie das in neueren Delphiversionen ist, aber unter Delphi 5 muss man den noch selbst setzen. Das mache ich auf jeden Fall mit einem
IDE-Experten automatisch nach dem Kompilieren.
Auslese kann man das ganze dann mit
Delphi-Quellcode:
Function GetPEDateTime(Filename : String) : double;
Var
fs : TFilestream;
signature : DWORD;
dos_header : IMAGE_DOS_HEADER;
pe_header : IMAGE_FILE_HEADER;
Begin
Result := EncodeDate(1968,8,22);
If Not Fileexists(Filename) Then
Exit;
fs := TFilestream.Create(FileName,fmOpenread Or fmShareDenyNone);
Result := 0;
Try
fs.read(dos_header,SizeOf(dos_header));
If dos_header.e_magic <> IMAGE_DOS_SIGNATURE Then
Exit;
fs.seek(dos_header._lfanew,soFromBeginning);
fs.read(signature,SizeOf(signature));
If signature <> IMAGE_NT_SIGNATURE Then
Exit;
fs.read(pe_header,SizeOf(pe_header));
Result := (EncodeDate(1970,1,1) + pe_header.Timedatestamp / SecsPerDay);
Finally
fs.Free;
End; { finally }
End;
Das ganze funktioniert wunderbar. Und der große Vorteil ist, dass dieses Datum nicht beim Versenden per eMail geändert wird.
Gruß
BBB