在mfc程序中启用子进程来调用一个console程序
希望能把console程序中的标准输出,就是类似 cout << ""
这样的结果截获到mfc程序中
而不需要对console程序进行修改

解决方案 »

  1.   

    可以在启动的时候加入参数,譬如你要调用的控制台应用程序的名字是a.exe
    你就这样启动
    a >>1.txt
    然后你打开1.txt,里面就是所有的a.exe运行过程中产生的到控制台的输出。另外,好像也可以通过管道来解决,不过我不太清楚怎么干。
      

  2.   

    使用匿名管道,实现如下://声明变量
    HANDLE    g_hForwardDoor;
    HANDLE    g_hForwardExit;
    HANDLE    g_hBackwardDoor;
    HANDLE    g_hBackwardExit;//实现函数
    BOOL ConnectPipe( LPSTR pszExe )
    {
        SECURITY_ATTRIBUTES sa;
        sa.nLength = sizeof(sa);
        sa.bInheritHandle = TRUE;
        sa.lpSecurityDescriptor = NULL;    if( !CreatePipe( &g_hBackwardExit, &g_hBackwardDoor, &sa, 0 ) )
            return FALSE;    if( !CreatePipe( &g_hForwardExit, &g_hForwardDoor, &sa, 0 ) )
            return FALSE;    HANDLE    hDummy = g_hForwardDoor;
        DuplicateHandle( GetCurrentProcess(), hDummy,
                         GetCurrentProcess(), &g_hForwardDoor, 0,
                         FALSE, DUPLICATE_SAME_ACCESS );    CloseHandle( hDummy );    PROCESS_INFORMATION    pi;
        STARTUPINFO    si;
        memset( &si, 0, sizeof(si) );
        si.cb = sizeof(si);
        si.dwFlags = STARTF_USESTDHANDLES;
        si.hStdInput = g_hForwardExit;    
        si.hStdOutput = g_hBackwardDoor;  
        if( !CreateProcess(NULL, pszExe, NULL, NULL, TRUE,
                           DETACHED_PROCESS, NULL, NULL, &si,
                           &pi ) )
    {
            AfxMessageBox("Create Process Failed!");
            return FALSE;
        }
        if( pi.hProcess )
            CloseHandle( pi.hProcess );
        if( pi.hThread )
            CloseHandle( pi.hThread );    return TRUE;
    }HGLOBAL GetOutput( void )
    {
        HANDLE    hMem;
        LPSTR    lpMem;
        DWORD    cbMem = 8192;
        DWORD    cbSize = 0;    CloseHandle( g_hBackwardDoor );    hMem = GlobalAlloc( GMEM_MOVEABLE, cbMem );    lpMem = (LPSTR)GlobalLock( hMem );
        for(;;) {
            DWORD    cbRead;
            BOOL    fRes;        fRes = ReadFile( g_hBackwardExit, lpMem + cbSize,
                             cbMem - cbSize, &cbRead, NULL);
            if( fRes == FALSE || cbRead == 0 )
                break;        cbSize += cbRead;        if( cbMem - cbSize < 8192 ) {
                cbMem += 8192;
                GlobalUnlock( hMem );
                hMem = GlobalReAlloc( hMem, cbMem,
                                      GMEM_MOVEABLE );            lpMem = (LPSTR)GlobalLock( hMem );
             }
        }    lpMem[cbSize] = '\0';    GlobalUnlock( hMem );    CloseHandle( g_hBackwardExit );
        return hMem;
    }//使用示例,供参考
      CString strCommandLine("route print");   
      ConnectPipe(strCommandLine.GetBuffer(0));
     HGLOBAL  hMem  = GetOutput();
      LPSTR    lpMem = (LPSTR)GlobalLock( hMem );
       
      CString strOutput(lpMem);