我在进程A中启动进程B,可以保留句柄,
通过GetExitCodeProcess不断查询。
但是,进程B的句柄会不会变无效(被释放?)什么时候?有没有什么其它方法,在B结束的时候通知A,而不是循环判断。
特别一点的是可能在A中启动上百个进程B C D……。另外:
A B C……这些进程都是我编写的。
我希望B C……都返回一个Resault(比如一个字符串吧)给A,
我要维护一张表,包括进程和它的返回结果。有什么方法可以容易的得到。
我想是写文件,然后A知道B终止了去读。但是效率可能不高。
不知道CreateProcess中LPSTARTUPINFO结构的那几个stdHadle怎么使用。

解决方案 »

  1.   

    首先找到目标进程的句柄hTarget
    WaitForSingleObject(hTarget, INFINTE);
      

  2.   

    首先找到目标进程的句柄hTarget
    WaitForSingleObject(hTarget, INFINTE);
      

  3.   

    下面一段代码,包括一个启动进程的函数,和一个检测进程结束的线程(还有一个启动进程的调用),在线程中循环检测。
    typedef struct
    {
    PROCESS_INFORMATION pi;
    STARTUPINFO         si;
    CString title;
    } PROCESSDATA, * LPPROCESSDATA;
    CPtrArray array;
    VOID Thread(LPVOID lParam)
    {
    DWORD exitCode;
    int count;
    LPPROCESSDATA ppd;
    for(;;)
    {
    count=array.GetSize();
    for(int i=0;i<count;i++)
    {
    ppd=(LPPROCESSDATA)array.GetAt(i);
    if (GetExitCodeProcess(ppd->pi.hProcess, &exitCode))
    {
    if(exitCode==STILL_ACTIVE)
    {
    }
    else
    {
    CString text;
    text.Format("%s:ExitCode=%d",ppd->title,exitCode);
    AfxGetApp()->m_pMainWnd->SetWindowText(text);
    delete ppd;
    array.RemoveAt(i);
    break;
    }
    }
    }
    Sleep(1000);
    }
    }
    void CheckInThread(LPCTSTR cmd)
    {
    LPPROCESSDATA ppd=new PROCESSDATA;
    ppd->si.cb              = sizeof(STARTUPINFO);
    ppd->si.lpReserved      = NULL;
    ppd->si.lpReserved2     = NULL;
    ppd->si.cbReserved2     = 0;
    ppd->si.lpDesktop       = NULL;
    ppd->si.lpTitle         = NULL;
    ppd->si.dwFlags         = 0;
    ppd->si.dwX             = 0;
    ppd->si.dwY             = 0;
    ppd->si.dwFillAttribute = 0;
    ppd->si.wShowWindow     = SW_SHOW;
    // 创建临时文件
    TCHAR szTempPath[MAX_PATH];
    DWORD dwResult=::GetTempPath(MAX_PATH,szTempPath);
    ASSERT(dwResult);
    TCHAR szTempFile[MAX_PATH];
    UINT nResult=::GetTempFileName(szTempPath,_T("Text"),0,szTempFile);
    ASSERT(nResult);
    CFile file(szTempFile,CFile::modeCreate|CFile::modeWrite);
    file.Write("等待你来关闭程序",16);
    file.Close();
    ppd->title=szTempFile;
    ppd->title=ppd->title.Right(ppd->title.GetLength()-1-ppd->title.ReverseFind('\\'));
    // 启动进程
    char cmdText[MAX_PATH];
    sprintf(cmdText,"Notepad %s",szTempFile);
    CreateProcess(
    NULL, // No module name (use command line). 
    cmdText, // Command line. 
    NULL, // Process handle not inheritable. 
    NULL, // Thread handle not inheritable. 
    FALSE, // Set handle inheritance to FALSE. 
    0, // No creation flags. 
    NULL, // Use parent's environment block. 
    NULL, // Use parent's starting directory. 
    &ppd->si, // Pointer to STARTUPINFO structure.
    &ppd->pi ); // Pointer to PROCESS_INFORMATION structure.
    if(array.GetSize()==0)
    AfxBeginThread((AFX_THREADPROC)Thread,0,THREAD_PRIORITY_NORMAL,0,0,NULL);
    array.Add(ppd);
    }
    void CCreateProcessDlg::OnButton() 
    {
    CheckInThread("Notepad.exe");
    }
      

  4.   

    看msdn有这么一段话,这个进程的句柄看来不会被系统close。
    lpProcessInformation 
    [out] Pointer to a PROCESS_INFORMATION structure that receives identification information about the new process. 
    Handles in PROCESS_INFORMATION must be closed with CloseHandle when they are no longer needed. wangjinwang(王进)的这段代码也就利用了这一点,这我以前是不确定的。
    判断进程终止,至少可以用轮询的方法来作。接下来就是后面的那个问题。当进程B有个字符串再结束时要返回给A,改如何做。
    ExitCode只是个UINT的变量:(
    精华区有一片再进程间传递字符串的帖子,但是大不开。
    谁还有帮忙贴一下好吗。
    而且我只是再结束时传递,有没有什么特别的方法可以用。3x