Erzeugt oder öffnet ein Jobobjekt.
#include <WinAPIProc.au3>
_WinAPI_CreateJobObject ( [$sName = '' [, $tSecurity = 0]] )
$sName | [optional] Der Name des Jobs. Groß-/ Kleinschreibung wird bei dem Namensvergleich beachtet. Wenn dieser Parameter '' ist, so wird der Job ohne einen Namen erzeugt. |
$tSecurity | [optional] Die $tagSECURITY_ATTRIBUTES Struktur welches den Sicherheitsdeskriptor für das Jobobjekt angibt und zudem festlegt ob Childprozesse das zurückgegebene Handle erben können. Wenn dieser Parameter 0 ist (Standard), dann bekommt das Jobobjekt einen Standardsicherheitsdeskriptor und das Handle kann nicht geerbt werden. |
Erfolg: | [optional] Das Handle eines Jobobjektes. Wenn das Objekt vor dem Funktionsaufruf existierte, so gibt die Funktion das Handle eines bereits bestehenden Jobobjektes zurück. |
Fehler: | 0. Es ist _WinAPI_GetLastError() aufzurufen um erweiterte Fehlerinformationen zu erhalten. |
Wenn ein Job erzeugt wird, wird dessen Buchführungsinformation mit 0 initialisiert, alle Limits sind inaktiv und es gibt keine assoziierten Prozesse. Um einen Prozess zu einem Jobobjekt hinzuzufügen, sollte man die _WinAPI_AssignProcessToJobObject() Funktion verwende.
Um die Limits für einen Job zu setzen, sollte man die _WinAPI_SetInformationJobObject() Funktion verwenden.
Um Buchführungsinformation anzufordern, sollte man die _WinAPI_QueryInformationJobObject() Funktion verwenden.
Alle Prozesse welche mit einem Job assoziiert sind müssen in der selben Session laufen. Ein Job wird in die selbe Session eingetragen wie der erste assoziierte Prozess zu einem Job.
Um ein Jobobjekthandle zu schließen sollte man die _WinAPI_CloseHandle() Funktion verwenden. Der Job wird zerstört, wenn das letzte Handle geschlossen wurde und alle assoziierte Prozesse beendet sind.
_WinAPI_AssignProcessToJobObject, _WinAPI_CloseHandle, _WinAPI_QueryInformationJobObject, _WinAPI_SetInformationJobObject
Suche nach CreateJobObject in der MSDN Bibliothek.
#include <WinAPIConv.au3>
#include <WinAPIHObj.au3>
#include <WinAPIProc.au3>
Local Const $sTemp = @TempDir & '\Test.au3'
; Create temporary .au3 file
Local $hFile = FileOpen($sTemp, 2)
For $i = 1 To 3
FileWriteLine($hFile, 'Run(@SystemDir & "\notepad.exe")' & @CRLF & 'Sleep(100)')
Next
FileClose($hFile)
; Run 3 times the "notepad.exe" and wait until you have closed all 3 processes
_RunWaitEx(@AutoItExe & ' /AutoIt3ExecuteScript "' & $sTemp & '"')
; Delete temporary .au3 file
FileDelete($sTemp)
Func _RunWaitEx($sCmd)
; Original idea by 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, $tStartup, $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