Einzelnen Beitrag anzeigen

Bomberbb

Registriert seit: 23. Sep 2003
227 Beiträge
 
#7

Re: Wann wurde die exe compiliert?

  Alt 29. Jan 2009, 07:48
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
  Mit Zitat antworten Zitat