Crée ou ouvre un objet Job (tâche)
#include <WinAPIProc.au3>
_WinAPI_CreateJobObject ( [$sName = '' [, $tSecurity = 0]] )
$sName | [optionnel] Le nom de la tâche. La comparaison des noms est sensible à la casse. Si ce paramètre est '', la tâche est créée sans nom. |
$tSecurity | [optionnel] Structure $tagSECURITY_ATTRIBUTES qui spécifie le descripteur de sécurité de l'objet Job et détermine si les processus enfants peuvent hériter du handle retourné. Si ce paramètre est 0 (par défaut), l'objet Job obtient un descripteur de sécurité par défaut et le handle ne peut pas être hérité. |
Succès: | Retourne le handle de l'objet Job. Si l'objet existait avant l'appel de fonction, la fonction retourne le handle à l'objet Job existant. |
Échec: | Retourne 0, appelez _WinAPI_GetLastError() pour obtenir des informations supplémentaires sur l'erreur. |
Quand une tâche est créée, son information de compte est initialisée à zéro, toutes les limites sont inactives, et il n'y a pas de processus associé. Pour assigner un processus à un objet Job, utilisez la fonction _WinAPI_AssignProcessToJobObject().
Pour définir les limites d'une tâche, utilisez la foncion _WinAPI_SetInformationJobObject().
Pour interroger les informations de compte, utilisez la fonction _WinAPI_QueryInformationJobObject().
Tous les processus associés à une tâche doivent s'exécuter dans la même session. Une tâche est associée à la session du premier processus à assigner à la tâche.
Pour fermer le handle d'un objet Job, utilisez la fonction _WinAPI_CloseHandle(). La tâche est détruite quand son dernier handle a été fermé et tous les processus associés sont terminés.
_WinAPI_AssignProcessToJobObject, _WinAPI_CloseHandle, _WinAPI_QueryInformationJobObject, _WinAPI_SetInformationJobObject
Consultez CreateJobObject dans la librairie MSDN.
#include <APIProcConstants.au3> #include <WinAPIConv.au3> #include <WinAPIHObj.au3> #include <WinAPIProc.au3> Local Const $sTemp = @TempDir & '\Test.au3' ; Crée un fichier temporaire .au3 Local $hFile = FileOpen($sTemp, 2) For $i = 1 To 3 FileWriteLine($hFile, 'Run(@SystemDir & "\calc.exe")' & @CRLF & 'Sleep(100)') Next FileClose($hFile) ; Exécute 3 fois "calc.exe" et attend jusqu'à ce que vous ayez fermé tous les 3 processus _RunWaitEx(@AutoItExe & '/AutoIt3ExecuteScript "' & $sTemp & '"') ; Supprime le fichier temporaire .au3 FileDelete($sTemp) Func _RunWaitEx($sCmd) ; Idée originale de amel27 Local $tProcess = DllStructCreate($tagPROCESS_INFORMATION) Local $tStartup = DllStructCreate($tagSTARTUPINFO) Local $tInfo = DllStructCreate($tagJOBOBJECT_BASIC_ACCOUNTING_INFORMATION) Local $hJob = _WinAPI_CreateJobObject() If Not $hJob Then Return SetError(1, 0, 0) DllStructSetData($tStartup, 'Size', DllStructGetSize($tStartup)) If Not _WinAPI_CreateProcess('', $sCmd, 0, 0, 0, BitOR($CREATE_BREAKAWAY_FROM_JOB, $CREATE_SUSPENDED), 0, 0, DllStructGetPtr($tStartup), DllStructGetPtr($tProcess)) Then Return SetError(1, _WinAPI_CloseHandle($hJob), 0) EndIf Local $hProcess = DllStructGetData($tProcess, 'hProcess') Local $hThread = DllStructGetData($tProcess, 'hThread') _WinAPI_AssignProcessToJobObject($hJob, $hProcess) _WinAPI_ResumeThread($hThread) _WinAPI_CloseHandle($hThread) Do If Not _WinAPI_QueryInformationJobObject($hJob, 1, $tInfo) Then ExitLoop EndIf Sleep(100) Until Not DllStructGetData($tInfo, 'ActiveProcesses') _WinAPI_CloseHandle($hProcess) _WinAPI_CloseHandle($hJob) Return 1 EndFunc ;==>_RunWaitEx Func _WinAPI_ResumeThread($hThread) Local $aRet = DllCall('kernel32.dll', 'dword', 'ResumeThread', 'ptr', $hThread) If @error Or (_WinAPI_DWordToInt($aRet[0]) = -1) Then Return SetError(1, 0, -1) Return $aRet[0] EndFunc ;==>_WinAPI_ResumeThread