UDF > WinAPIEx > Processes & Synchronization > Processes >


_WinAPI_CreateJobObject

Cr�e ou ouvre un objet Job (t�che)

#include <WinAPIProc.au3>
_WinAPI_CreateJobObject ( [$sName = '' [, $tSecurity = 0]] )

Param�tres

$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�.

Valeur de retour

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.

Remarques

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.

En relation

_WinAPI_AssignProcessToJobObject, _WinAPI_CloseHandle, _WinAPI_QueryInformationJobObject, _WinAPI_SetInformationJobObject

Voir aussi

Consultez CreateJobObject dans la librairie MSDN.

Exemple

#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