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 Frage zu GetProcessMemoryInfo (https://www.delphipraxis.net/77204-frage-zu-getprocessmemoryinfo.html)

Mackhack 16. Sep 2006 05:55


Frage zu GetProcessMemoryInfo
 
Hi,

weis jemand warum da nur Schrott rauskommt?

Delphi-Quellcode:
function TfoMain.ShowMemoryUsage(ProcessId: DWORD): DWORD;
var
  hProcess: THandle;
  PMC: TProcessMemoryCounters;
begin
  Result := 0;
  hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, ProcessId);
  try
    begin
      if ( hProcess = 0 ) then
        Exit;
      if ( GetProcessMemoryInfo(hProcess, @PMC, SizeOf(PMC)) ) then
        Result := PMC.cb;
    end;
  finally
    CloseHandle(hProcess);
  end;
end;
Oder muss ich noch irgendwie Speicher zuweisen oder sowas?

Danke!

_rEdoX 16. Sep 2006 09:15

Re: Frage zu GetProcessMemoryInfo
 
Delphi-Quellcode:
Result := PMC.cb;
wird zu ->

Delphi-Quellcode:
Result := PMC.WorkingSetSize;

Mackhack 17. Sep 2006 02:48

Re: Frage zu GetProcessMemoryInfo
 
Hi,

dank dir. Mein Code sieht jetzt so aus:

Delphi-Quellcode:
function TfoMain.ShowMemoryUsage(ProcessId: DWORD): DWORD;
var
  hProcess: THandle;
  PMC: PPROCESS_MEMORY_COUNTERS;
  cb: Integer;
begin
  Result := 0;
  cb := SizeOf(PMC);
  GetMem(PMC, cb);
  try
    PMC^.cb := cb;
    hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, ProcessId);
    begin
      if ( hProcess = 0 ) then
        Exit;
      if ( GetProcessMemoryInfo(hProcess, @PMC, SizeOf(PMC)) ) then
        Result := (PMC^.WorkingSetSize Div 1024)
      else
        ShowMessage(SysErrorMessage(GetLastError));
    end;
  finally
    CloseHandle(hProcess);
    FreeMem(PMC, SizeOf(_PROCESS_MEMORY_COUNTERS));
  end;
end;
und ich bekomme diesen Fehler:

Zitat:

---------------------------
Processviewer
---------------------------
The data area passed to a system call is too small
---------------------------
OK
---------------------------
Woran liegt das jetzt?

marabu 17. Sep 2006 07:47

Re: Frage zu GetProcessMemoryInfo
 
Hallo Tobias,

du hast von einer statischen Struktur (TProcessMemoryCounters) auf eine dynamische (PProcessMemoryCounters) umgestellt, aber in deinem Code geht es etwas durcheinander. Probiere es mal so:

Delphi-Quellcode:
function TfoMain.ShowMemoryUsage(ProcessId: DWORD): DWORD;
var
  hProcess: THandle;
  PMC: PPROCESS_MEMORY_COUNTERS;
  cb: Integer;
begin
  Result := 0;
  //  cb := SizeOf(PMC); // = 4;
  cb := SizeOf(PMC^);
  GetMem(PMC, cb);
  try
    PMC^.cb := cb;
    hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, ProcessId);
    begin
      if ( hProcess = 0 ) then
        Exit;
      //  if ( GetProcessMemoryInfo(hProcess, @PMC, SizeOf(PMC)) ) then
      if ( GetProcessMemoryInfo(hProcess, PMC, SizeOf(PMC^)) ) then
        Result := (PMC^.WorkingSetSize Div 1024)
      else
        ShowMessage(SysErrorMessage(GetLastError));
    end;
  finally
    CloseHandle(hProcess);
    FreeMem(PMC, SizeOf(_PROCESS_MEMORY_COUNTERS));
  end;
end;
Grüße vom marabu

Mackhack 17. Sep 2006 07:53

Re: Frage zu GetProcessMemoryInfo
 
Hallo Marabu,

kannst du mir mal erklaeren warum du die Veraenderungen gemacht hast? Ich verstehe das irgendwie jetzt nicht so recht. Ich muss auch zugeben ich habe diese Veraenderung von TProcessMemoryCounters nach PPROCESS_MEMORY_COUNTERS gemacht ohne es wirklich verstanden zu haben. War mehr Trial & Error.

Hats du mir da vlt. eine kurze Erklaerung was denn der Unterschied ist von eben TProcessMemoryCounters und PPROCESS_MEMORY_COUNTERS?

Danke

marabu 17. Sep 2006 08:16

Re: Frage zu GetProcessMemoryInfo
 
Zwar stehen mir die Header unter D7 nicht zur Verfügung, aber alleine aufgrund der Namenskonvention handelt es sich bei TMemoryProcessCounters um einen Record, während PProcessMemoryCounters ein Zeiger auf einen solchen Record darstellt. SizeOf(PMC) ist also die Größe eines Zeigers (4), während du die Größe der Struktur benötigst - SizeOf(PMC^), denn der Zeiger dürfte so deklariert worden sein:

Delphi-Quellcode:
type
  PProcessMemoryCounters = ^TProcessMemoryCounters;
  TProcessMemoryCounters = record
  end;
marabu

Mackhack 17. Sep 2006 08:17

Re: Frage zu GetProcessMemoryInfo
 
Ah,

vielen Dank. Ich bin grad dran die Sache mit den Zeigern und co. zu lernen :-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:32 Uhr.

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