Delphi 挂起子进程

Delphi 挂起子进程,delphi,process,Delphi,Process,我正在使用creatprocess api创建一个子进程。我创建了一个jobobject并将该子进程分配给jobobject。 现在,若我杀死父进程,子进程也会终止。但若我挂起父进程,子进程不会挂起并继续执行。 当父进程被挂起时,是否有挂起子进程的选项 我用来创建进程的Delphi代码 Function ExecuteProcess(EXE : String) : THandle; Var SI : TStartupInfo; PI : TProcessInformatio

我正在使用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;

从WindowsAPI的角度来看,没有挂起进程这样的事情。只能挂起线程,但线程之间没有父子关系。因为没有“子线程”,所以当父线程被挂起时,没有自动挂起它们的机制。(您可以创建一个挂起的进程,但这是因为当它第一次创建时,只有一个线程,并且它被创建为挂起。)

如果要挂起子进程的所有线程,请使用与挂起父进程线程相同的方法来挂起它们


您还可以尝试未记录的
NtSuspendProcess
函数,如

欢迎使用堆栈溢出中所述。一旦它开始运行,你真的不应该暂停任何东西。除非线程正在挂起自身,否则您不知道该线程是否处于安全挂起状态。它可能在IO操作的中间,或者它可能在内存管理器上持有锁。无论你想解决什么问题,我建议你找一个不同的解决方案。如果你能描述你的问题,你可以在Stack Overflow.Hi上发布。我的问题是,我开发了一个安全应用程序,这个应用程序使用硬件执行一些操作,如果出现问题,它将终止它创建的进程。我的问题是,如果我使用process explorer挂起主进程,我创建的进程将继续执行,我的主应用程序将失去对它们的控制。我不能做安全控制。子进程不是我开发的,我没有它们的源代码。我想让你在一篇新的问题帖子中描述你的问题。不过我不明白你的问题。您还没有告诉我为什么要挂起进程。谢谢,但是internet explorer是如何执行此操作的?我已经打开了3个浏览器和其中的2个选项卡。如果使用process explorer挂起第一个创建的浏览器,则所有浏览器都将挂起。新打开的浏览器是主浏览器的线程吗?是的,我相信是这样。您不能用Process Explorer确认吗?当您打开一个新选项卡或窗口时,是否会获得另一个进程条目?如果我打开一个新窗口,我会在主进程下看到新进程。如果我挂起主进程,所有windows都将挂起。屏幕截图:您的屏幕截图并不表示任何内容已挂起。也许孩子们只是和父母沟通,当父母没有反应时(由于被暂停),孩子们会阻止等待反应。我也是。我认为这些过程相互沟通。谢谢