Delphi   发布时间:2022-04-11  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了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你可以下载工作演示项目.

大佬总结

以上是大佬教程为你收集整理的delphi – 如何创建一个Child进程,具体取决于它的父进程?全部内容,希望文章能够帮你解决delphi – 如何创建一个Child进程,具体取决于它的父进程?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。