Delphi-PRAXiS

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.

Bomberbb 29. Jan 2009 08:33

Re: Wann wurde die exe compiliert?
 
Sorry, habe die ganze Zeit auf den Falschen Link geklickt. :wall:
Aber wie schaut das denn aus mit dem Setzen des Zeitstempels. Bei Delphi 5 ging's nicht automatisch. Wird er in neueren Delphi-versionen mit gesetzt?

BBB

Luckie 29. Jan 2009 08:34

Re: Wann wurde die exe compiliert?
 
Also ich nutze den Code seit Delphi6 und es hat immer funktioniert.

Bomberbb 29. Jan 2009 08:40

Re: Wann wurde die exe compiliert?
 
Noch ein Grund für ein Update. :roll:

Grolle 29. Jan 2009 08:41

Re: Wann wurde die exe compiliert?
 
Hi,

[OT]Kann man damit eine exe eindeutig identifizieren?[/OT]

Viele Grüße ...

Luckie 29. Jan 2009 08:51

Re: Wann wurde die exe compiliert?
 
Dazu würde ich eher einen Hash über die Exe-Datei bilden.

Grolle 29. Jan 2009 08:58

Re: Wann wurde die exe compiliert?
 
Hi

[immer noch OT]
@Luckie
stimmt. Beides zu kombinieren wär bestimmt auch nicht verkehrt.
[/genug OT jetzt!]

Viele Grüße ..


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:58 Uhr.

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