Funktionreferenz


_WinAPI_CreateJobObject

Beschreibung anzeigen in

Erzeugt oder öffnet ein Jobobjekt.

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

Parameter

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

Rückgabewert

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.

Bemerkungen

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.

Verwandte Funktionen

_WinAPI_AssignProcessToJobObject, _WinAPI_CloseHandle, _WinAPI_QueryInformationJobObject, _WinAPI_SetInformationJobObject

Siehe auch

Suche nach CreateJobObject in der MSDN Bibliothek.

Beispiel

#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