我的应用程序(main.exe)正在使用
ShellExecuteEx执行子进程(child.exe).
但是当我关闭或杀死(通过Process-Explorer)main.exe时,子进程仍然处于活动状态.
如何优雅地处理,当main.exe终止child.exe终止时?
解决方法
你需要使用
jobs.主可执行文件应该是
create a job object,然后你需要
set JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE标志到你的工作对象.
uses JobsApi; //... var jLimit: TJobObjectExtendedLimitInformation; hJob := CreateJobObject(nil,PChar('JobName'); if hJob <> 0 then begin jLimit.BasicLimitInformation.LimitFlags := JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE; SetInformationJobObject(hJob,JobObjectExtendedLimitInformation,@jLimit,SizeOf(TJobObjectExtendedLimitInformation)); end;
然后,您需要使用CreateProcess函数执行另一个进程,其中dwCreationFlags必须设置为CREATE_BREAKAWAY_FROM_JOB.如果此函数成功调用AssignProcessToJobObject.
function ExecuteProcess(const EXE : String; const AParams: string = ''; AJob: Boolean = True): THandle; var SI : TStartupInfo; PI : TProcessInformation; AFlag: Cardinal; begin Result := INVALID_HANDLE_VALUE; FillChar(SI,SizeOf(SI),0); SI.cb := SizeOf(SI); if AJob then AFlag := CREATE_BREAKAWAY_FROM_JOB else AFlag := 0; if CreateProcess( nil,PChar(EXE + ' ' + AParams),nil,False,AFlag,SI,PI ) then begin { close thread handle } CloseHandle(PI.hThread); Result := PI.hProcess; end; end; //... hApp := ExecuteProcess('PathToExecutable'); if hApp <> INVALID_HANDLE_VALUE then begin AssignProcessToJobObject(hJob,hApp); end;
完成所有这些操作后,即使主可执行文件已被终止,所有子进程也将自动终止.你可以得到JobsApi单元here.注意:我没有用Delphi 7测试它.
编辑:Here你可以下载工作演示项目.