Hallo,
ich möchte den virtuellen Speicher eines Prozesses ermitteln.
Kann mir jemand auf die Sprünge helfen, wie ich da dran komme ?
Danke und Grüße
Asterix
Hallo,
ich möchte den virtuellen Speicher eines Prozesses ermitteln.
Kann mir jemand auf die Sprünge helfen, wie ich da dran komme ?
Danke und Grüße
Asterix
Am einfachsten mit WMI.
Hab dir mal ne Mini-Funktion gebastelt wo du nur die Prozess-ID (bekommst du z.B. über ProcessExists() heraus) eintragen musst und zürück kommt die Größe des verwendeten virtuellen Speichers:
Bsp:
[autoit]$Prozessname = "explorer.exe"
$ProzessID = ProcessExists($Prozessname)
$VirtMem = _GetProcessVirtualMem($ProzessID)
MsgBox(0,"",$Prozessname & ': ' & $VirtMem & ' Bytes')
[/autoit][autoit][/autoit][autoit][/autoit][autoit]Func _GetProcessVirtualMem($PID)
Local $WMIObj = ObjGet("winmgmts:\\localhost\root\CIMV2")
If @error Then Return SetError(1,1,-1)
For $i In $WMIObj.ExecQuery("SELECT VirtualSize FROM Win32_Process WHERE ProcessId = " & $PID, "WQL", 48)
Return $i.VirtualSize
Next
Return SetError(2,2,-1)
EndFunc
Hi,
danke für die schnelle Hilfe. Ist so ungefähr das, was ich wollte. Jetzt habe nur ein Problem: der zurück gelieferte
Wert stimmt nicht mit dem Wert überein, der vom taskmanager angezeigt wird. Das wird wohl aber ein Fehler
von Winzigweich sein.
Wie kann ich denn das berichtigen ?
BZW. wo bekommt der Taskmanager den Soeicherwert her ...
Danke
Asterix
Wie kann man im Taskmanager den virtuellen Arbeitsspeicher eines Prozesses anzeigen?...
Hab jetzt grad nur Vista vor mir und da wird standardmäßig nur der Wert "Arbeitsspeicher - Privater Arbeitssatz" angezeigt.
Das hat mit dem virtuellen Arbeitsspeicher aber nichts zu tun.
Woher dieser Wert kommt - ganz ehrlich: Keine Ahnung.
Glaube mich zu erinnern das unter XP standardmäßig der WorkingSetSize-Wert angezeigt wird - bin aber nicht mehr sicher.
Diesen bekommst du mit ProcessGetStats() heraus.
Ansonsten musst du auch beachten das die Angaben zum Virtuellen Speicher in Byte angegeben sind und du sie noch durch 1024 teilen musst damit sie, wie im Explorer in KB stehen.
Ansonsten hab ich dir mal eine Funktion geschrieben die detailiertere Informationen zum Speicherverbrauch eines Prozesses zurückgibt:
[autoit]$Prozessname = "firefox.exe"
$PMemInfo = _GetProcessMemInfo($Prozessname)
$Text = $Prozessname & @CRLF & @CRLF & _
"PeakWorkingSetSize: " & $PMemInfo[0] & ' kb' & @CRLF & _
"WorkingSetSize: " & $PMemInfo[1] & ' kb' & @CRLF & _
"QuotaPeakPagedPoolUsage: " & $PMemInfo[2] & ' kb' & @CRLF & _
"QuotaPagedPoolUsage: " & $PMemInfo[3] & ' kb' & @CRLF & _
"QuotaPeakNonPagedPoolUsage: " & $PMemInfo[4] & ' kb' & @CRLF & _
"QuotaNonPagedPoolUsage: " & $PMemInfo[5] & ' kb' & @CRLF & _
"PagefileUsage: " & $PMemInfo[6] & ' kb' & @CRLF & _
"PeakPagefileUsage: " & $PMemInfo[7] & ' kb' & @CRLF & _
"PrivateUsage: " & $PMemInfo[8] & ' kb'
MsgBox(0,"", $Text)
[/autoit][autoit][/autoit][autoit][/autoit][autoit]Func _GetProcessMemInfo($PID)
Local $PROCESS_MEMORY_COUNTERSEX, $StructSize, $PHandle, $StructPointer
Local $RetArray[9]
If IsString($PID) Then $PID = ProcessExists($PID)
If $PID < 1 Then Return SetError(1,1,$RetArray)
$PHandle = DllCall("Kernel32.dll", "int", "OpenProcess", "dword", 0x400 + 0x10, "dword", False, "dword", $PID)
If @error Or Not $PHandle[0] Then Return SetError(2,2,$RetArray)
$PHandle = $PHandle[0]
$PROCESS_MEMORY_COUNTERSEX = DllStructCreate("dword; dword; uint; uint; uint; uint; uint; uint; uint; uint; uint")
$StructSize = DllStructGetSize($PROCESS_MEMORY_COUNTERSEX)
$StructPointer = DllStructGetPtr($PROCESS_MEMORY_COUNTERSEX)
DllCall("Psapi.dll", "int", "GetProcessMemoryInfo", "hwnd", $PHandle, "ptr", $StructPointer, "dword", $StructSize)
DllCall("Kernel32.dll", "int", "CloseHandle", "hwnd", $PHandle)
For $i = 0 To 8
$RetArray[$i] = DllStructGetData($PROCESS_MEMORY_COUNTERSEX, $i + 2) / 1024
Next
Return $RetArray
EndFunc
Edit: "PrivateUsage"-Wert noch dazu genommen (ab XP > SP2)
Hallo AspirinJunkie,
genau das war's.
Der Taskmanager zeigt als virtuellen Speicher den Wert ""PeakPagefileUsage: " & $PMemInfo[7] & ' kb' & @CRLF & _" an.
Vielen Dank für Deine Hilfe !!!!!!
Viele Grüße
Asterix