当前位置 : 主页 > 编程语言 > delphi >

delphi – 暂停子进程

来源:互联网 收集:自由互联 发布时间:2021-06-23
我正在使用creatprocess api创建子进程.我创建了一个jobobject并将此子进程分配给jobobject. 现在,如果我杀死我的父进程,子进程也会终止.但是如果我挂起父进程,子进程不会挂起并继续执行.
我正在使用creatprocess api创建子进程.我创建了一个jobobject并将此子进程分配给jobobject.
  现在,如果我杀死我的父进程,子进程也会终止.但是如果我挂起父进程,子进程不会挂起并继续执行.
  当父进程被暂停时,是否有任何选项可以暂停子进程?

我用于创建流程的Delphi代码

Function ExecuteProcess(EXE : String) : THandle;

Var
SI      : TStartupInfo;
PI      : TProcessInformation;
Begin
  Result := INVALID_HANDLE_VALUE;
  FillChar(SI,SizeOf(SI),0);
  SI.cb := SizeOf(SI);
  If 
    CreateProcess(nil,PChar('.\'+EXE),nil,nil,False,CREATE_SUSPENDED,
     nil,nil,SI,PI) Then 
   Begin
    ResumeThread(PI.hThread);
    CloseHandle(PI.hThread);
    Result := PI.hProcess;
   End
  Else ShowMessage('CreateProcess failed: '+
                   SysErrorMessage(GetLastError));
End;
从Windows API的角度来看,没有暂停进程的事情.只能挂起线程,但线程之间没有父子关系.由于没有“子线程”,因此在父项被挂起时没有自动挂起它们的机制. (您可以创建一个暂停的进程,但那是因为当它首次创建时,只有一个线程,并且它被创建为暂停.)

如果要挂起子进程的所有线程,则enumerate them并以挂起父进程的线程的方式挂起它们.

您也可以尝试使用未记录的NtSuspendProcess函数,如Windows: Atomically suspend an entire process?中所述

网友评论