Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Größe der eignenen Exe-Datei erfahren (https://www.delphipraxis.net/85893-groesse-der-eignenen-exe-datei-erfahren.html)

phreax 6. Feb 2007 15:51


Größe der eignenen Exe-Datei erfahren
 
Hallo zusammen,
Ja der Titel sagt ja schon fast alles ich möchte die Größe der laufenden Anwendung bekommen.
ALLERDINGS nicht mittlels Filesize() da ich nämlich Daten an die Exe angehängt habe. Gibt es nun eine Möglichkeit die Dateigröße aus dem Exe-Header zu lesen, oder sie auf eine andere Art zu ermitteln?

danke für alle Beiträge im Voraus :D

mfg Phreax

3_of_8 6. Feb 2007 15:57

Re: Größe der eignenen Exe-Datei erfahren
 
Du willst also die Größe des kompilierten Codes haben?

kill -9 6. Feb 2007 16:00

Re: Größe der eignenen Exe-Datei erfahren
 
Hey :hi:
Wenn ich das richtig einschätze willst du die Länge der angehängten Daten ermitteln?
Das kannst du viel einfacher machen wenn du die Länge gleich mit zu den Daten schreibst und dann anhängst,
sonst könntest du (falls es sich um eine von dir erstellte datei handelt) die Größe vor dem Kompilieren in die
Versionsinfos o.ä. schreiben..

himitsu 6. Feb 2007 16:41

Re: Größe der eignenen Exe-Datei erfahren
 
Na ja, die Größe steht irgendwie in dem EXE-Header mit drin (k.A. wo, aber ich bin mir da recht sicher)


Was aber dein Problem angeht,

du könntest dir ja mal Luckie's SFXTools ansehn?
(da werden auch Daten an die EXE angehängt)

http://luckie-online.de/dirindex.php...phi/Programme/

Luckie 6. Feb 2007 16:46

Re: Größe der eignenen Exe-Datei erfahren
 
Hehe, da habe ich geschummelt und die Größe der Exe hardgecodet. Aber Nico hatte, glaube ich, mal einen Code gepostet dafür.

ErazerZ 6. Feb 2007 17:02

Re: Größe der eignenen Exe-Datei erfahren
 
Ist ganz simpel, einfach die PointerToRawData von der letzten (oder größten sektion) auslesen und mittels SizeOfRawData zusammenzählen.


Edit:
Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

uses
  Windows;

function IntToStr(i: Integer): string;
begin
  Str(i, Result);
end;
 
var
  { Datei Öffnen }
  hFile: THandle;
  lpNumberOfBytesRead: DWORD;
  { Zwischenspeicherung }
  lpBuffer: Pointer;
  x: Word;
  dwTmp, dwSize, dwWinSize: Cardinal;
  { PE-Stuff }
  NtHeaders: PImageNtHeaders;
  Section: PImageSectionHeader;
begin
  dwSize := 0;
  dwWinSize := 0;
  hFile := CreateFile(PChar(ParamStr(0)), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
  if (hFile <> INVALID_HANDLE_VALUE) then
  begin
    dwWinSize := GetFileSize(hFile, nil);
    GetMem(lpBuffer, $800); // nur 2048 Bytes einlesen, mehr sollte nicht benötigt werden.
    ReadFile(hFile, lpBuffer^, $800, lpNumberOfBytesRead, nil);
    if (lpBuffer <> nil) then
    begin
      NtHeaders := PImageNtHeaders(Cardinal(lpBuffer) + Cardinal(PImageDosHeader(lpBuffer)._lfanew));
      if (NtHeaders^.Signature = IMAGE_NT_SIGNATURE) then
      begin
        for x := 0 to NtHeaders^.FileHeader.NumberOfSections -1 do
        begin
          Section := PImageSectionHeader(Cardinal(NtHeaders) + SizeOf(TImageNtHeaders) + (SizeOf(TImageSectionHeader) * x));
          dwTmp := Section.PointerToRawData + Section.SizeOfRawData;
          if (dwTmp > dwSize) then
            dwSize := dwTmp;
        end;
        FreeMem(lpBuffer);
      end;
    end;
  end;
  CloseHandle(hFile);
  WriteLn('WinFileSize: ' + IntToStr(dwWinSize));
  WriteLn('MyFileSize: ' + IntToStr(dwSize));
  ReadLn;
  { TODO -oUser -cConsole Main : Hier Code einfügen }
end.

phreax 6. Feb 2007 19:00

Re: Größe der eignenen Exe-Datei erfahren
 
Danke für die superschnelle Hilfe!!! :dp:

@ DErazerZer Code funktioniert wunderbar :D

@kill -9 Nein ich wollte ie 3_of_8 sagte die größe des kompilierten codes.

Zum Hintergrund, ich war es leid bei jeder Änderung meins Programms (eines Installers) das Projekt zu kompilieren, die Exe Größe zu kopieren im Programm zu setzen und neu zu kompilieren ;)
Wenn interesse besteht werde ich ihn in nächster Zeit (wenn er vollends ausgereift ist) hier in der DP veröffentlichen... (aber eigentlich benutzt ja jeder inno-setup :roll: )


Also nochmals danke für die superpromte hilfe an alle!

mfg Phreax


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:21 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