我用creatpipe建立一个双管道与cmd控制台程序的通信,能顺利建立和输入输出操作, 
但问题是,我建立进程时,就建立了一个***.exe的控制台程序,按原来在cmd运行的方法,结束这个exe程序是按CTRL+C, 
但我用管道输入^C,或者3(ASCII)等方法都不能将哪exe程序从进程中删除, 请各位帮我出谋啊。

解决方案 »

  1.   

    直接TerminateProcess() 结束进程..
      

  2.   

    TerminateProcess的句柄是piProcInfo.hProcess吗?还是piProcInfo.hThread   (其中 PROCESS_INFORMATION piProcInfo;)我这两种都试过了
    不行啊
      

  3.   

    GenerateConsoleCtrlEvent(CTRL_C_EVENT,piProcInfo.dwProcessId);是这样用吗?也不行啊,难道没权限关闭他?
      

  4.   

    CreateProcess时加上CREATE_NEW_PROCESS_GROUP标志。
      

  5.   

    加上CREATE_NEW_PROCESS_GROUP,然后结束时GenerateConsoleCtrlEvent(CTRL_C_EVENT,piProcInfo.dwProcessId); 就可以吗?不行啊,还有什么操作全部告诉我啊,非常感谢
      

  6.   

    没有其它操作了。
    又看了一下你前面的描述,感觉问题有点怪,好像是子进程在内核态出了什么问题,否则TerminateProcess是不会有问题的,除非句柄不对。当你打算结束子进程的时候,如果改成输入命令,可以继续执行吗?
      

  7.   

    是GetLastError()说句柄不对啊子进程一直在运行啊,正常执行
      

  8.   

    具体代码:
    void CVirtualHubDlg::CreateChildProcess(void)
    // Create a child process that uses the previously created pipes for STDIN and STDOUT.
    {    STARTUPINFO siStartInfo;
       BOOL bSuccess = FALSE; 
     
       ZeroMemory( &siStartInfo, sizeof(STARTUPINFO) );
       siStartInfo.cb = sizeof(STARTUPINFO); 
       siStartInfo.hStdError = g_hChildStd_OUT_Wr;
       siStartInfo.hStdOutput = g_hChildStd_OUT_Wr;
       siStartInfo.hStdInput = g_hChildStd_IN_Rd;
       siStartInfo.wShowWindow = SW_HIDE; 
    siStartInfo.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; 
     
       bSuccess = CreateProcess(NULL, 
          (LPWSTR)(LPCTSTR)m_szCmdLine,     // command line 
          NULL,          // process security attributes 
          NULL,          // primary thread security attributes 
          TRUE,          // handles are inherited 
          0|CREATE_NEW_PROCESS_GROUP,             // creation flags 
          NULL,          // use parent's environment 
          NULL,          // use parent's current directory 
          &siStartInfo,  // STARTUPINFO pointer 
          &piProcInfo);  // receives PROCESS_INFORMATION 
       if ( ! bSuccess ) 
          ErrorExit(TEXT("CreateProcess"));
       else 
       {
          CloseHandle(piProcInfo.hProcess);
          CloseHandle(piProcInfo.hThread);
       }
    }
    然后就进行管道操作,我试过terminateprocess之前,piProcInfo的句柄是没有变过的啊
      

  9.   

    你把句柄给关闭了,这里不要CloseHandle,当进程结束后再CloseHandle。
      

  10.   

      if ( ! bSuccess ) 
          ErrorExit(TEXT("CreateProcess")); 
      else 
      { 
          Waitforsingleobject(piProcInfo.hProcess,一直等);
          CloseHandle(piProcInfo.hProcess); 
          CloseHandle(piProcInfo.hThread); 
      } 

      

  11.   

    Waitforsingleobject不是一直在等吗?那我还用其他操作?