Sujet intéressant !
Pour les droits, effectivement la piste est bonne (j'ai honteusement utilisé la valeur brute de fonderie ... à embellir avec un nom de variable plus explicite, il était tard hier soir ...)
DllCall("kernel32.dll", "hwnd", "OpenProcess",... renvoie un tableau , mais chaque composante est une string casté à la volée des fois en int, mais pas un handle
Mais ce n'est pas grave ! car ce qu'on passe à DllCall("kernel32.dll", "int", "GetProcessTimes", ... c'est une String castée en "hwnd" (et non "int", attention !).
Par contre le gros problème de l'appel, c'est les pointeurs, car là, DllStructGetPtr ne marche pas comme ça ...
Il faut créer des Structures via Dllstructcreate, pour pouvoir en extraire des pointeur. Ce n'est pas aussi souple qu'en C (c'est rare qu'on dise que le C est plus simple qu'Autoit ^^)
Donc ici voici le script remodifié, avec des pointeur pointant vers des structure de type FILETIME comme expliquer ici
http://msdn.microsoft.com/en-us/library ... S.85).aspx
J'affiche à la fin les différents retours. D'après ce qu'ils disent, il s'agit de 2 * 32bits à concaténer pour avoir une expression dont l'unité est 100 nano secondes.
voilà :
► Afficher le texte
Code : Tout sélectionner
#include <Constants.au3>
#include <WinAPI.au3>
#include <array.au3>
$processus = ProcessList("lsass.exe") ; ne fonctionne pas
;$processus = ProcessList("explorer.exe") ; fonctionne -> un handle est récupéré
; http://msdn.microsoft.com/en-us/library ... #40;VS.85).aspx
$temp = DllCall("kernel32.dll", "hwnd", "OpenProcess", _
"dword",0x0400, _
"int", False, _
"dword", $processus[1][1])
$h = $temp[0]
_ArrayDisplay($temp)
MsgBox(0, $h, IsHWnd($h)) ; je ne récupère pas un handle...
recupereCpuProcessus($h)
DllCall("kernel32.dll", "byte", "CloseHandle", _
"hwnd", $h)
Exit
Func recupereCpuProcessus($handleProcessus)
Local $Creationtag = DllStructCreate("ulong Creationtag;ulong Creationtag2")
DllStructSetData($Creationtag,"Creationtag",8)
Local $lpCreationTime = DllStructGetPtr($Creationtag);,"Creationtag")
Local $ExitTime = DllStructCreate("ulong ExitTime;ulong ExitTime2")
DllStructSetData($ExitTime,"ExitTime",$tagFILETIME)
Local $lpExitTime = DllStructGetPtr($ExitTime);,"ExitTime")
Local $KernelTime = DllStructCreate("ulong KernelTime;ulong KernelTime2")
DllStructSetData($KernelTime,"KernelTime",$tagFILETIME)
Local $lpKernelTime = DllStructGetPtr($KernelTime);,"KernelTime")
Local $UserTime = DllStructCreate("ulong UserTime;ulong UserTime2")
DllStructSetData($UserTime,"UserTime",$tagFILETIME)
Local $lpUserTime = DllStructGetPtr($UserTime);,"UserTime")
; http://msdn.microsoft.com/en-us/library ... #40;VS.85).aspx
$r = DllCall("kernel32.dll", "int", "GetProcessTimes", _
"hwnd", $handleProcessus, _
"ptr", $lpCreationTime, _
"ptr", $lpExitTime, _
"ptr", $lpKernelTime, _
"ptr", $lpUserTime)
_ArrayDisplay($r)
ConsoleWrite(DllStructGetData($Creationtag,"Creationtag")&" "&DllStructGetData($Creationtag,"Creationtag2")&@CRLF)
ConsoleWrite(DllStructGetData($ExitTime,"ExitTime")&" "&DllStructGetData($ExitTime,"ExitTime2")&@CRLF)
ConsoleWrite(DllStructGetData($KernelTime,"KernelTime")&" "&DllStructGetData($KernelTime,"KernelTime2")&@CRLF)
ConsoleWrite(DllStructGetData($UserTime,"UserTime")&" "&DllStructGetData($UserTime,"UserTime2")&@CRLF)
If $r[0] = 0 Then
ConsoleWrite("!! Erreur GetProcessTimes" & @CRLF)
Return SetError(1, "", -1)
EndIf
EndFunc ;==>recupereCpuProcessus
le TODO restant serai d'utiliser "FileTimeToSystemTime" pour convertir ces types de valeur en une structure de type SYSTEMTIME (voir le lien sur
http://msdn.microsoft.com/en-us/library ... S.85).aspx )
qui est ainsi :
typedef struct _SYSTEMTIME {
WORD wYear;
WORD wMonth;
WORD wDayOfWeek;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD wMilliseconds;
} SYSTEMTIME, *PSYSTEMTIME;
bon courrage ^^
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.