Einzelnen Beitrag anzeigen

Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#1

Größe der eigenen laufenden Anwendung ermitteln

  Alt 7. Feb 2007, 10:03
ErazerZ zeigt in diesem Beitrag, wie es möglich ist, die Größe der laufenden Anwendung zu ermitteln. Dies ist vor allem dann geeignet, wenn Dateien an die eigene Anwendung angehängt sind und somit Delphi-Referenz durchsuchenFileSize nicht das gewünschte Ergebnis liefert.

Delphi-Quellcode:
function GetApplicationSize(var AppWinSize, AppDwSize: Int64): Boolean;
var
  { Datei Öffnen }
  hFile: THandle;
  lpNumberOfBytesRead: DWORD;
  { Zwischenspeicherung }
  lpBuffer: Pointer;
  x: Word;
  dwTmp, dwSize, dwWinSize: Cardinal;
  { PE-Stuff }
  NtHeaders: PImageNtHeaders;
  Section: PImageSectionHeader;
  TmpResult: Boolean;
begin
  dwSize := 0;
  dwWinSize := 0;
  TmpResult := false;
  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;
        TmpResult := true;
        FreeMem(lpBuffer);
      end;
    end;
  end;
  CloseHandle(hFile);

  AppWinSize := dwWinSize;
  AppDwSize := dwSize;
  result := TmpResult;
end;
[edit=CalganX]Mfg, CalganX[/edit]
  Mit Zitat antworten Zitat