不知道应该在哪里问,这里高手如云,贴到这来了。 就是让我的EDIT控件成为另外一个CONSOLE程序的STDOUT,有办法么?

解决方案 »

  1.   

    可以,
    创建一个匿名管道
    SECURITY_ATTRIBUTES saPipe;
    saPipe.nLength = sizeof(SECURITY_ATTRIBUTES);
    saPipe.lpSecurityDescriptor = NULL;
    saPipe.bInheritHandle = TRUE;
    BOOL bRet = CreatePipe(&hRead, &hWrite, &saPipe, 0); // 创建匿名管道然后ReadFile(hRead, ReadBuf, 100, &ReadNum, NULL)读取
      

  2.   

    对对,就是匿名管道,这里的 hRead,hWrite 应该传什么?
      

  3.   

    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    SECURITY_ATTRIBUTES saPipe;
    saPipe.nLength = sizeof(SECURITY_ATTRIBUTES);
    saPipe.lpSecurityDescriptor = NULL;
    saPipe.bInheritHandle = TRUE;
    char ReadBuf[100];
    DWORD ReadNum;
    HANDLE hRead; // 管道读句柄
    HANDLE hWrite; // 管道写句柄
    BOOL bRet = CreatePipe(&hRead, &hWrite, &saPipe, 0); // 创建匿名管道

    // 得到本进程的当前标准输出
    HANDLE hTemp = GetStdHandle(STD_OUTPUT_HANDLE);

    GetStartupInfo(&si); // 获取本进程的STARTUPINFO结构信息
    //si.hStdInput = hRead;
    si.hStdOutput=hWrite;
    si.hStdError=hWrite;
    si.dwFlags=STARTF_USESTDHANDLES;
    si.cb=sizeof(si); 
    si.wShowWindow = SW_HIDE;
    si.dwXSize = si.dwYSize = 0;
    bRet = CreateProcess(NULL, "ping www.baidu.com -t", NULL, NULL, TRUE, NULL, NULL, NULL, &si, &pi); // 创建子进程
    SetStdHandle(STD_OUTPUT_HANDLE, hTemp); // 恢复本进程的标准输出 CloseHandle(hWrite); // 关闭写句柄

    // 读管道直至管道关闭
    while (ReadFile(hRead, ReadBuf, 100, &ReadNum, NULL))
    {
    ReadBuf[ReadNum] = '\0';
    CString strMsg;

    strMsg.Format("从管道:[%s]\n", ReadBuf, ReadNum);
    m_list.AddString(strMsg);
    m_list.UpdateWindow(); }
      

  4.   

    请问 seu07201213 兄,为什么在读管道之前就已经把写句柄关闭了呢?
       CloseHandle(hWrite); // 关闭写句柄
    还有,虽然用了
       si.wShowWindow = SW_HIDE;
    但是我的控制台窗口还是显示的。STARTUPINFO si;
    PROCESS_INFORMATION pi;
    SECURITY_ATTRIBUTES saPipe;
    saPipe.nLength = sizeof(SECURITY_ATTRIBUTES);
    saPipe.lpSecurityDescriptor = NULL;
    saPipe.bInheritHandle = TRUE;
    char ReadBuf[100];
    DWORD ReadNum;
    HANDLE hRead; // 管道读句柄
    HANDLE hWrite; // 管道写句柄
    BOOL bRet = CreatePipe(&hRead, &hWrite, &saPipe, 0); // 创建匿名管道// 得到本进程的当前标准输出
    HANDLE hTemp = GetStdHandle(STD_OUTPUT_HANDLE);GetStartupInfo(&si); // 获取本进程的STARTUPINFO结构信息
    si.hStdOutput=hWrite;
    si.hStdError=hWrite;
    si.dwFlags=STARTF_USESTDHANDLES;
    si.cb=sizeof(si);
    si.wShowWindow = SW_HIDE;
    si.dwXSize = si.dwYSize = 0;
    bRet = CreateProcess(NULL, "ping 127.0.0.1", NULL, NULL, TRUE, NULL, NULL, NULL, &si, &pi); // 创建子进程
    SetStdHandle(STD_OUTPUT_HANDLE, hTemp); // 恢复本进程的标准输出
    CloseHandle(hWrite); // 关闭写句柄,为什么关闭?

    // 读管道直至管道关闭
    BOOL loop = TRUE;
    while (loop)
    {
    MSG msg;
    if( ::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE) )
    {
            TranslateMessage(&msg); 
            DispatchMessage(&msg);
    }
    loop = ReadFile(hRead, ReadBuf, 100, &ReadNum, NULL);
    ReadBuf[ReadNum] = '\0';
    CString strMsg;
    strMsg.Format("从管道:[%s]\n", ReadBuf, ReadNum);
    m_list.AddString(strMsg);
    m_list.UpdateWindow();
    }
      

  5.   

    哦,看了一下MSDN,
    加上 si.dwFlags=STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;
    就不会出现控制台窗口了。