加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 04:09:38 所属栏目:大数据 来源:网络整理
导读:我的应用程序(main.exe)正在使用 ShellExecuteEx执行子进程(child.exe). 但是当我关闭或杀死(通过Process-Explorer)main.exe时,子进程仍然处于活动状态. 如何优雅地处理,当main.exe终止child.exe终止时? 解决方法 你需要使用 jobs.主可执行文件应该是 creat
我的应用程序(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你可以下载工作演示项目.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读