自己开发的程序为A。在A中启动进程B,B又启动进程C,之后B退出,C继续运行,如何判断进程C何时结束,是否正常结束。
注:B和C都是第三方软件。如何在A中完成上述功能。

解决方案 »

  1.   

    要求很古怪。大约可以使用Snap Process的方式来搞掂。
    没有其它办法来确定C是由A进程间接生成的,特别是如果进程用CreateProcess(..., CREATE_NEW_PROCESS_GROUPCREATE_NEW_PROCESS_GROUP,...)就基本无望了。
    如果同时有四个C,分别是A1->B1->C1、A2->B2->C2、B3->C3、C4,恐怕微软自己也没办法搞清楚C1, C2, C3, C4 哪个是由A1间接生成,哪个是由A2间接生成的了。
      

  2.   

    DWORD dwRet = WaitForSingleObject(ProcessB_ID,INFINITE);
    if (WAIT_OBJECT_0 == dwRet)//如果进程B结束
    {
        //枚举系统内所有进程,查找每个进程的父进程,如果父进程ID为ProcessB_ID,
          说明该进程为C,在用WaitForSingleObject等待进程C结束,并用GetExitCodeProcess
          获取进程C退出的返回值,判断是否正常退出。如果C在生成D或更多进程,那就比较复杂
          了。
    }
      

  3.   

    两种方法:
    1、给B注入一个hook, hook掉B的CreateProcessW,当B创建C后让你的A用DuplicateObject复制一份C的Handle,你就可以通过WaitForSingleObject等待C结束了
    2、更简单的方法:你的A用DEBUG_PROCESS标志创建B进程,然后你可以通过调试事件CREATE_PROCESS_DEBUG_EVENT/EXIT_PROCESS_DEBUG_EVENT事件得知C的创建和结束