我的程序启动一个进程,如何确定它以及它的自进程全部退出?(

解决方案 »

  1.   

    CreateProcess()获得进程的handle
    然后使用WaitForSingleObject()等待这个handle
      

  2.   

    如果这个进程是你写的的话,那么你可以用内核变量来判断,就是这个进程CreateMutex,然后你的进程CreateMutex看看结果就能知道前一个进程有没有结束。如果这个进程不是你写的话,那么你可以遍历进程看能不能找到它。
      

  3.   

    WaitForSingleObject的话得等着了。
      

  4.   

    to  idAnts(你才无聊呢)   jerrytse(聪明笨伯) 
    这个被启动的进程不是我写的,而这个被启动的进程可能启动另外一个进程,以此类推
    我希望确定这个进程和他所有的子进程、孙子进程等都已经退出
      

  5.   

    WaitForSingleObject等待句柄返回好了
      

  6.   

    WaitForSingleObject就行了。 其它的子进程退出。还是不退出。是他程序的原因。不是你的原因。
      

  7.   

    to up 2
    老大们摆脱好好看看问题吧,如果我的子进程建立了他的子进程, WaitForSingleObject 怎么能知道他的子进程是否退出那??
      

  8.   

    to  BLsoft(網龍ζ龍活)(341万平方公里)  
    晕啊,老大我保证不是什么非法的勾当
    我是想让用户用我的程序启动某个程序,然后挂起我的程序,直到某个程序完成它的操作,
    本来我是用WaitForSingleObject,不过发现某些程序会启动一个进程后自己就退出了,所以才有这个要求很急
    谢谢
      

  9.   

    我就是想作一个类似 Total Uninstall  的东西!! 
      

  10.   

    那就枚举所有的进程,然后获得这些进程handle
      

  11.   

    枚举所有的进程,然后用FindWindowA,查找!
      

  12.   

    to oyljerry(【勇敢的心】→ ㊣快回家了,赞㊣)
    我已经做过一个类似的东西
    我轮询获得所有的进程句柄,然后根据这些进程的父进程句柄递归查找子进程, 但这种方法效率很低,而且如果我在进入某个子进程的递归时,其他的子进程退出,那我就无法获得已经退出子进程的子进程了
      

  13.   

    BOOL GetExitCodeProcess(
      HANDLE hProcess,
      LPDWORD lpExitCode
    用这个试试
      

  14.   

    GetExitCodeProcess() 和WaitForSingleObject() 
    应该可以对付你自己的进程以及你自己进程启动的别人的进程,如果出现"孙"进程,如果还要用上面的,那要想法得到他孙进程句柄.不知道能不能用"作业"来实现,我晚上回去看看< 核心编程> 再来和大家讨论学习
      

  15.   

    to fbmsf(FBM) 
    请详细点,返回值可以确定此进程是否有子进程吗?
      

  16.   

    to  surstar(断水流www.uisoft.net准备出本诗集叫《执着》售价13.1)
    不止是有孙进程,可能还会有曾孙增增孙进程
      

  17.   

    先枚举到你所有的子进程和孙进程的handle,再用这个函数试试
    WaitForMultipleObjects(nCount,lpHandles,TRUE,INFINITE);
      

  18.   

    创建一个线程,在里面再创建你的其他线程(不然主程序会出现阻塞假死情况),并用WaitForSingleObject等待单个线程,用楼上说的WaitForMultipleObjects等待多个线程。
      

  19.   

    给你一个函数 查制定的进程在进程列表中是否存在 
    DWORD CXXXXXDlg::FindAppProcessID()
    {
    HANDLE handle=::CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);
    PROCESSENTRY32 Info;
    Info.dwSize = sizeof(PROCESSENTRY32);
    if(::Process32First(handle,&Info))
    {
    do{
    CString ss=Info.szExeFile;
    if(!ss.CompareNoCase(m_strSoft+".exe"))
    {
    ::CloseHandle(handle);
    return Info.th32ProcessID;
    }
    }
    while(::Process32Next(handle,&Info));
    ::CloseHandle(handle);
    }
    return -1;
    }