Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Wann wurde die exe compiliert? (https://www.delphipraxis.net/128378-wann-wurde-die-exe-compiliert.html)

FriFra 28. Jan 2009 22:30


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?

Luckie 28. Jan 2009 22:35

Re: Wann wurde die exe compiliert?
 
Hast du das gesucht: http://www.michael-puff.de/Developer...imeStamp.shtml

Andreas L. 28. Jan 2009 22:35

Re: Wann wurde die exe compiliert?
 
Hi,
vielleicht hilft dir das hier weiter:

http://www.delphi-treff.de/tipps/dat...n%20ermitteln/

EDIT: Man muss aber das Datum der letzten Änderung nehmen. Lässt sich in den Code leicht einbauen...

Ciao,
Andy

Luckie 28. Jan 2009 23:01

Re: Wann wurde die exe compiliert?
 
Zitat:

Zitat von Andreas L.
Hi,
vielleicht hilft dir das hier weiter:

http://www.delphi-treff.de/tipps/dat...n%20ermitteln/

EDIT: Man muss aber das Datum der letzten Änderung nehmen. Lässt sich in den Code leicht einbauen...

Ciao,
Andy

Das ist aber nicht sicher. Zum einem kann man diesen Zeitstemepl recht leicht manipulieren und zum anderen kann es passieren, dass Windows ihn beim Kopieren von einem Datenträger ändert.

Andreas L. 28. Jan 2009 23:48

Re: Wann wurde die exe compiliert?
 
Zitat:

Zitat von Luckie
Zitat:

Zitat von Andreas L.
Hi,
vielleicht hilft dir das hier weiter:

http://www.delphi-treff.de/tipps/dat...n%20ermitteln/

EDIT: Man muss aber das Datum der letzten Änderung nehmen. Lässt sich in den Code leicht einbauen...

Ciao,
Andy

Das ist aber nicht sicher. Zum einem kann man diesen Zeitstemepl recht leicht manipulieren und zum anderen kann es passieren, dass Windows ihn beim Kopieren von einem Datenträger ändert.

Stimmt, hast recht. Hab wohl nicht weit genug gedacht :oops:

FriFra 29. Jan 2009 01:54

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 ;)

Bomberbb 29. Jan 2009 07:48

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:
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

Luckie 29. Jan 2009 07:58

Re: Wann wurde die exe compiliert?
 
Und genau das macht auch der von mir verlinkte Code von Nico. ;)

Bomberbb 29. Jan 2009 08:10

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

Luckie 29. Jan 2009 08:20

Re: Wann wurde die exe compiliert?
 
Er holt den Timestamp genau wie du aus dem PE-Header:
Delphi-Quellcode:
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;
Nur bei Borland Exe-Dateien macht er noch etwas zusätzlich.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:31 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz