2012-01-11 111 views
4

我正在用creatprocess api创建子进程。并且我创建了一个工作对象并将此子进程分配给了工作对象。
现在,如果我杀了我的父进程,子进程也会终止。但是如果我暂停父进程,子进程不会暂停并继续执行。
当父进程暂停时,是否有任何选项可以暂停子进程?暂停子进程

德尔福代码,我已经用于创建过程

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; 
+3

欢迎提到堆栈溢出。一旦它开始运行,你真的不应该中止任何事情。除非某个线程正在挂起*本身*,否则您并不真正知道线程是否处于挂起状态的安全状态。例如,它可能处于IO操作的中间,或者它可能在内存管理器上存在锁定。无论你想解决什么问题,我建议你找到一个不同的解决方案。如果你能描述你的问题,你可以在Stack Overflow上发布。 – 2012-01-11 22:22:21

+0

嗨。我的问题是,我开发了一个安全应用程序,此应用程序使用硬件进行一些操作,如果出现问题,它将终止它创建的进程。我的问题是,如果我暂停使用进程资源管理器的主进程,我创建的进程继续执行,并且我的主应用程序对它们失去控制。我无法执行安全控制。而子进程不是由我开发的,我没有它们的源代码。 – galove 2012-01-12 06:54:48

+0

我的意思是你在新的问题文章中描述你的问题。不过,我不明白你的问题。你还没有告诉你为什么要暂停进程。 – 2012-01-12 12:56:40

回答

4

从Windows API的角度看,有没有这样的东西作为暂停的过程。只有线程可以挂起,但线程之间没有父子关系。由于没有“子线程”,因此在父项暂停时没有自动挂起的机制。 (您可以创建进程暂停,但这是因为它是第一次创建的时候,只有一个线程,创建暂停。)

如果要暂停子进程的所有线程,然后enumerate them并以挂起父进程的线程的方式挂起它们。

您也可以尝试无证NtSuspendProcess功能,如Windows: Atomically suspend an entire process?

+0

谢谢,但是,如何Internet Explorer做这个操作?我已经打开了3个浏览器和2个标签。如果我暂停第一个创建的浏览器与进程资源管理器,它们都会暂停。主浏览器的新打开的浏览器线程? – galove 2012-01-12 07:02:26

+0

是的,我相信。你不能用Process Explorer确认吗?当你打开一个新的标签或窗口时,你是否获得另一个流程条目? – 2012-01-12 12:52:33

+0

如果我打开一个新的窗口,我看到主进程下的新进程。如果我暂停主进程所有窗口suspend.screenshot:http://s8.postimage.org/mjxu9ff11/image.jpg – galove 2012-01-12 14:38:35