AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Frage zu GetProcessMemoryInfo

Ein Thema von Mackhack · begonnen am 16. Sep 2006 · letzter Beitrag vom 17. Sep 2006
Antwort Antwort
Benutzerbild von Mackhack
Mackhack

Registriert seit: 29. Nov 2003
Ort: San Diego, CA/USA
1.446 Beiträge
 
Delphi 2006 Architect
 
#1

Frage zu GetProcessMemoryInfo

  Alt 16. Sep 2006, 06:55
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!
Um etwas Neues zu schaffen muss man seine Ohren vor den Nein-sagern verschliessen um seinen Geist öffnen zu können.
(George Lukas)
  Mit Zitat antworten Zitat
_rEdoX

Registriert seit: 2. Jun 2006
Ort: Bochum
24 Beiträge
 
Delphi 7 Professional
 
#2

Re: Frage zu GetProcessMemoryInfo

  Alt 16. Sep 2006, 10:15
Result := PMC.cb; wird zu ->

Result := PMC.WorkingSetSize;
  Mit Zitat antworten Zitat
Benutzerbild von Mackhack
Mackhack

Registriert seit: 29. Nov 2003
Ort: San Diego, CA/USA
1.446 Beiträge
 
Delphi 2006 Architect
 
#3

Re: Frage zu GetProcessMemoryInfo

  Alt 17. Sep 2006, 03:48
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?
Um etwas Neues zu schaffen muss man seine Ohren vor den Nein-sagern verschliessen um seinen Geist öffnen zu können.
(George Lukas)
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: Frage zu GetProcessMemoryInfo

  Alt 17. Sep 2006, 08:47
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
  Mit Zitat antworten Zitat
Benutzerbild von Mackhack
Mackhack

Registriert seit: 29. Nov 2003
Ort: San Diego, CA/USA
1.446 Beiträge
 
Delphi 2006 Architect
 
#5

Re: Frage zu GetProcessMemoryInfo

  Alt 17. Sep 2006, 08:53
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
Um etwas Neues zu schaffen muss man seine Ohren vor den Nein-sagern verschliessen um seinen Geist öffnen zu können.
(George Lukas)
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: Frage zu GetProcessMemoryInfo

  Alt 17. Sep 2006, 09:16
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
  Mit Zitat antworten Zitat
Benutzerbild von Mackhack
Mackhack

Registriert seit: 29. Nov 2003
Ort: San Diego, CA/USA
1.446 Beiträge
 
Delphi 2006 Architect
 
#7

Re: Frage zu GetProcessMemoryInfo

  Alt 17. Sep 2006, 09:17
Ah,

vielen Dank. Ich bin grad dran die Sache mit den Zeigern und co. zu lernen
Um etwas Neues zu schaffen muss man seine Ohren vor den Nein-sagern verschliessen um seinen Geist öffnen zu können.
(George Lukas)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:09 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