![]() |
Speicherauslastung eines beliebigen Prozesses anzeigen
Hallo, ich habe folgendes Problem.
Ich will auslesen, wieviel Speicher ein Prozess benötigt. Die Prozesse sammt Prozess ID und den anderen Kram anzuzeigen ist kein Problem. Ich habe auch schon eine Prozedur gefunden, mit der die Speicherauslastung des Prozesses in der ich die Prozedur ausführe anzeigen kann, aber an die anderen komm ich nicht ran...
Delphi-Quellcode:
Wie kann ich diese Prozedur so abändern, dass sie mir die Speicherauslastung von jedem beliebigen Prozess anzeigt?
uses psAPI;
procedure TForm1.Button2Click(Sender: TObject); var pmc: PPROCESS_MEMORY_COUNTERS; cb: Integer; begin cb := SizeOf(_PROCESS_MEMORY_COUNTERS); GetMem(pmc, cb); pmc^.cb := cb; if GetProcessMemoryInfo(GetCurrentProcess(), pmc, cb) then Label1.Caption := IntToStr(pmc^.WorkingSetSize) + ' Bytes' else Label1.Caption := 'Unable to retrieve memory usage structure'; FreeMem(pmc); end; |
Re: Speicherauslastung eines beliebigen Prozesses anzeigen
Wenn du GetCurrentProcess() durch OpenProcess(...) ersetzt, könntest du vielleicht zum ziel kommen ...
Sagen wir so: es sollte funktionieren ... |
Re: Speicherauslastung eines beliebigen Prozesses anzeigen
Ich hab mal ein paar Kombinationen getestet, leider führten sie nicht zum Ziel.
Die Betreffende Zeile sieht jetzt so aus:
Delphi-Quellcode:
if GetProcessMemoryInfo(OpenProcess(1, BOOL(0), PrID), pmc, cb) then
|
Re: Speicherauslastung eines beliebigen Prozesses anzeigen
Du musst dir einen anderen dwDesiredAccess -Flag suchen. Ich hab das so gelöst:
Delphi-Quellcode:
1012 is nur ne gültige PID, bei mir im moment ...
if GetProcessMemoryInfo(OpenProcess(PROCESS_ALL_ACCESS,false,1012), pmc, cb) then
Es gibt folgende Flags: MSDN PROCESS_ALL_ACCESS Specifies all possible access flags for the process object. PROCESS_CREATE_PROCESS Used internally. PROCESS_CREATE_THREAD Enables using the process handle in the CreateRemoteThread function to create a thread in the process. PROCESS_DUP_HANDLE Enables using the process handle as either the source or target process in the DuplicateHandle function to duplicate a handle. PROCESS_QUERY_INFORMATION Enables using the process handle in the GetExitCodeProcess and GetPriorityClass functions to read information from the process object. PROCESS_SET_INFORMATION Enables using the process handle in the SetPriorityClass function to set the priority class of the process. PROCESS_TERMINATE Enables using the process handle in the TerminateProcess function to terminate the process. PROCESS_VM_OPERATION Enables using the process handle in the VirtualProtectEx and WriteProcessMemory functions to modify the virtual memory of the process. PROCESS_VM_READ Enables using the process handle in the ReadProcessMemory function to read from the virtual memory of the process. PROCESS_VM_WRITE Enables using the process handle in the WriteProcessMemory function to write to the virtual memory of the process. SYNCHRONIZE Windows NT: Enables using the process handle in any of the wait functions to wait for the process to terminate. Ich hoffe, dass es jetzt funktioniert ... ciao, Philipp |
Re: Speicherauslastung eines beliebigen Prozesses anzeigen
Das funst immer noch nicht!
Delphi-Quellcode:
In der Listbox2 stehen die Prozess IDs (z.B. 0340). Eigentlich müsste es doch langsam mal laufen...
procedure TForm1.Button2Click(Sender: TObject);
var pmc: PPROCESS_MEMORY_COUNTERS; cb: Integer; PrID: Integer; // processidentifier begin PrID := StrToInt('$' + Listbox2.Items.Strings[Listbox1.Itemindex]); cb := SizeOf(_PROCESS_MEMORY_COUNTERS); GetMem(pmc, cb); pmc^.cb := cb; if GetProcessMemoryInfo(OpenProcess(PROCESS_ALL_ACCESS, false, PrID), pmc, cb) then Label1.Caption := IntToStr(pmc^.WorkingSetSize) + ' Bytes' else Label1.Caption := 'Unable to retrieve memory usage structure'; FreeMem(pmc); end; |
Re: Speicherauslastung eines beliebigen Prozesses anzeigen
Aha ... da liegt der fehler:
Delphi-Quellcode:
Die PID (ProcessID) ist nicht hexadezimal! Es ist eine einfache, ganze Zahl! Mit '$' gibst du aber an, dass es eine Hexadezimalzahl ist! Ändere das, und es sollte funktionieren.
PrID := StrToInt('$' + Listbox2.Items.Strings[Listbox1.Itemindex]);
ciao, Philipp |
Re: Speicherauslastung eines beliebigen Prozesses anzeigen
Moin Philipp,
Zitat:
|
Re: Speicherauslastung eines beliebigen Prozesses anzeigen
Doch, die PIDs sind Hexa-Dezimal! Ich hatte halt eine angegeben, die nicht Hexa-Dezimal aussieht...
|
Re: Speicherauslastung eines beliebigen Prozesses anzeigen
Moin Patrick,
leider hast Du bislang nicht angegeben, was nicht funktioniert. Am besten schreibst Du mal im else Zweig
Delphi-Quellcode:
um eine nähere Beschreibung zu bekommen, was nicht geklappt hat.
ShowMessage(SysErrorMessage(GetLastError));
Ausserdem solltest Du bei OpenProcess mal PROCESS_QUERY_INFORMATION verwenden, statt PROCESS_ALL_ACCESS. Letzteres geht bei Systemprozessen schief, da hier die Zugriffsrechte nicht ausreichen. Auch sollte man OpenProcess keinesfalls so als Parameter verwenden, da das zurückgegebene Handle auch wieder geschlossen werden muss. Das Ganze könnte z.B. so aussehen:
Delphi-Quellcode:
var
pmc : PPROCESS_MEMORY_COUNTERS; cb : Integer; PrID : Integer; // processidentifier hProc : DWORD; begin PrID := 8; cb := SizeOf(_PROCESS_MEMORY_COUNTERS); pmc := AllocMem(cb); try pmc^.cb := cb; hProc := OpenProcess(PROCESS_QUERY_INFORMATION, false, PrID); if hProc <> 0 then begin try if GetProcessMemoryInfo(hProc, pmc, cb) then begin ShowMessage(IntToStr(pmc^.WorkingSetSize) + ' Bytes'); end else begin ShowMessage(SysErrorMessage(GetLastError));; end; finally CloseHandle(hProc); end; end; finally FreeMem(pmc,SizeOf(_PROCESS_MEMORY_COUNTERS)); end; end; |
Re: Speicherauslastung eines beliebigen Prozesses anzeigen
Also sieht der Quellcode jetzt so aus:
Delphi-Quellcode:
dann funktioniert es Teilweise, mit 3 verschiedenen Fehlermeldungen, bei verschiedenen Prozessen:
procedure TForm1.Button2Click(Sender: TObject);
var pmc: PPROCESS_MEMORY_COUNTERS; cb: Integer; PrID: Integer; // processidentifier begin PrID := StrToInt('$' + Listbox2.Items.Strings[Listbox1.Itemindex]); cb := SizeOf(_PROCESS_MEMORY_COUNTERS); GetMem(pmc, cb); pmc^.cb := cb; if GetProcessMemoryInfo(OpenProcess(PROCESS_QUERY_INFORMATION, false, PrID), pmc, cb) then Label1.Caption := IntToStr(pmc^.WorkingSetSize) + ' Bytes' else Label1.Caption := 'Unable to retrieve memory usage structure'; ShowMessage(SysErrorMessage(GetLastError)); FreeMem(pmc); end; 1. Das Fenster hat keine Bildlaufleisten /mal eine interessante Meldung 2. Das Handle ist ungültig 3. irgendetwas mit nugülter Klasse / nur selten, fast willkürlich Zu bemerken ist, dass nur bei der zweiten Meldung nix gescheites angezeigt wird, mit den anderen geht es. Bei dem Quellcode von Christian funktioniert es nahezu bei jedem Prozess. Ich hab dann noch ein
Delphi-Quellcode:
eingebaut und festgestellt, dass dies (bei z.B. svchost.exe die zwei von vier Prozessen die vom SYSTEM ausgeführt werden) ein "Zugriff verweigert" ergibt. Dies war wohl beim obrigen Quellcode der selbe Fehler, halt durch eine andere Fehlermeldung ausgedrückt.
hProc := OpenProcess(PROCESS_QUERY_INFORMATION, false, PrID);
if hProc <> 0 then begin ... else ShowMessage(SysErrorMessage(GetLastError)); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:16 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 by Thomas Breitkreuz