![]() |
Wann wurde die exe compiliert?
Ich weiß, dass es eine Möglichkeit gibt den Zeitstempel der Compilierung einer Delphi-Anwendung auszulesen, aber ich kann es gerade nicht finden. Hat jemand einen Tipp?
|
Re: Wann wurde die exe compiliert?
Hast du das gesucht:
![]() |
Re: Wann wurde die exe compiliert?
Hi,
vielleicht hilft dir das hier weiter: ![]() EDIT: Man muss aber das Datum der letzten Änderung nehmen. Lässt sich in den Code leicht einbauen... Ciao, Andy |
Re: Wann wurde die exe compiliert?
Zitat:
|
Re: Wann wurde die exe compiliert?
Zitat:
|
Re: Wann wurde die exe compiliert?
@Luckie: Genau das was Du ials erstes verlinkt hat, hab ich gesucht ;) Danke!
P.S.: Deine Seite bekomm ich in der Firma nicht aufgerufen, weil "puff" geblockt ist ;) |
Re: Wann wurde die exe compiliert?
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:
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.
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; Auslese kann man das ganze dann mit
Delphi-Quellcode:
Das ganze funktioniert wunderbar. Und der große Vorteil ist, dass dieses Datum nicht beim Versenden per eMail geändert wird.
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; Gruß BBB |
Re: Wann wurde die exe compiliert?
Und genau das macht auch der von mir verlinkte Code von Nico. ;)
|
Re: Wann wurde die exe compiliert?
@lucky:
Da bin ich mir nicht so sicher. Wenn ich den Code von Nico richtig verstanden habe, wird da der Wert angezeigt, der bei einer Datei unter 'Eigenschaften' - 'Erstellt' steht angegeben. Und der kann sich von dem Datum im PE-Header unterscheiden. Ich hatte das Problem öfters beim Versenden per eMail. Da wurde beim Speichern der Datei aus dem Dateianhang das Datum neu gesetzt. Un genau das passiert beim PE-Header nicht! BBB |
Re: Wann wurde die exe compiliert?
Er holt den Timestamp genau wie du aus dem PE-Header:
Delphi-Quellcode:
Nur bei Borland Exe-Dateien macht er noch etwas zusätzlich.
if not ReadFile(FileHandle, ImageDosHeader, SizeOf(TImageDosHeader),
BytesRead, nil) or (BytesRead <> SizeOf(TImageDosHeader)) or (ImageDosHeader.e_magic <> IMAGE_DOS_SIGNATURE) then begin ImageDosHeader._lfanew := 0; end; // Read PE32 header (including optional header if (SetFilePointer(FileHandle, ImageDosHeader._lfanew, nil, FILE_BEGIN) = INVALID_SET_FILE_POINTER) then begin Exit; end; if not(ReadFile(FileHandle, ImageNtHeaders, SizeOf(TImageNtHeaders), BytesRead, nil) and (BytesRead = SizeOf(TImageNtHeaders))) then begin Exit; end; // Validate PE32 image header if (ImageNtHeaders.Signature <> IMAGE_NT_SIGNATURE) then begin Exit; end; // Seconds since 1970 (UTC) Result := ImageNtHeaders.FileHeader.TimeDateStamp; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:57 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz