delphi – 如何创建一个Child进程,具体取决于它的父进程?

前端之家收集整理的这篇文章主要介绍了delphi – 如何创建一个Child进程,具体取决于它的父进程?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我的应用程序(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你可以下载工作演示项目.

原文链接:https://www.f2er.com/delphi/102062.html

猜你在找的Delphi相关文章