Danke für den
MSDN Link!
Habe jetzt vollgendes Versucht:
Zuerst einen Job anlegen:
Code:
hJob := CreateJobObject(nil,'Test App JOB');
Dann einen Process mit CreatProcess starten:
Code:
..
..
hProcess := RunProcess('notepad.exe',SW_SHOW,False,ProcID);
..
..
function RunProcess(FileName: string; ShowCmd: DWORD; wait: Boolean; ProcID: PDWORD): Longword;
var
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
ExitInfo : PExitThreadDebugInfo;
begin
FillChar(StartupInfo, SizeOf(StartupInfo), #0);
StartupInfo.cb := SizeOf(StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;
StartupInfo.wShowWindow := ShowCmd;
if not CreateProcess(nil,@Filename[1],nil,nil,False,CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,nil,nil,StartupInfo,ProcessInfo) then
Result := WAIT_FAILED
else
begin
AssignProcessToJobObject(hJob,ProcessInfo.hProcess);
if wait = FALSE then
begin
// if ProcID <> nil then ProcID^ := ProcessInfo.dwProcessId;
exit;
end;
WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
GetExitCodeProcess(ProcessInfo.hProcess, Result);
end;
if ProcessInfo.hProcess <> 0 then
CloseHandle(ProcessInfo.hProcess);
if ProcessInfo.hThread <> 0 then
CloseHandle(ProcessInfo.hThread);
end;
Wenn es gestartet wurde mache ich mit AssignProcessToJobObject(hJob,ProcessInfo.hProcess ); den Process zu dem Job.
Wie kann ich nun überprüfen ob der Job noch Prozesse enthaltet?
Ich habe mit QueryInformationJobObject herumprobiert, jedoch ohne Erfolg!
Gibt es dazu noch ein Beispiel?
Auf jeden Fall scheint das mit dem Assignen zu funktionieren, denn wenn ich
Code:
TerminateJobObject(hJob,Exitcode);
CloseHandle(hJob);
mache schließt sich Notepad wieder!