用在程序里用Creatprocess启动另外的进程,而且不显示那个进程的窗口,那个进程是一个小的命令行程序,输出是在命令行窗口输出。
怎么才能得到那个进程的输出,用重定向可以吗?怎么重定向?
我在第二个参数里command line用"程序名+命令参数+>>tmp.txt",可是没法重定向。

解决方案 »

  1.   

    4、不显示Console窗口的Console程序
    在默认情况下/subsystem 和/entry开关是匹配的,也就是:
    "console"对应"mainCRTStartup"或者"wmainCRTStartup"
    "windows"对应"WinMain"或者"wWinMain"
    我们可以通过手动修改的方法使他们不匹配。例如:#include "windows.h"
    #pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" ) // 设置入口地址 
    void main(void)
    {
    MessageBox(NULL, "hello", "Notice", MB_OK);
    }这个Console程序就不会显示Console窗口。如果选/MLd的话,这个程序只需要链接LIBCD.LIB user32.lib kernel32.lib。http://search.csdn.net/Expert/topic/2490/2490731.xml?temp=.5557978
      

  2.   

    管道重定向。下面这段代码是把windows的ping 程序的内容输出到edit里面的。HANDLE hReadPipe;
    HANDLE hWritePipe;
    SECURITY_ATTRIBUTES sat;
    STARTUPINFO startupinfo;
    PROCESS_INFORMATION pinfo;
    BYTE buffer[1024];
    DWORD byteRead;
    CString rString;UpdateData();
    if(m_Host=="")
    {
    MessageBox("主机地址不能为空!");
    return;
    }
    m_Host="c:\\windows\\ping.exe "+m_Host;sat.nLength=sizeof(SECURITY_ATTRIBUTES);
    sat.bInheritHandle=true;
    sat.lpSecurityDescriptor=NULL;
    if(!CreatePipe(&hReadPipe,&hWritePipe,&sat,NULL))
    {
    MessageBox("Create Pipe Error!");
    return;
    }
    startupinfo.cb=sizeof(STARTUPINFO);
    GetStartupInfo(&startupinfo);
    startupinfo.hStdError=hWritePipe;
    startupinfo.hStdOutput=hWritePipe;
    startupinfo.dwFlags=STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
    startupinfo.wShowWindow=SW_HIDE;
    if(!CreateProcess(NULL,m_Host.GetBuffer(m_Host.GetLength()+1),NULL, NULL, TRUE, NULL, NULL, NULL,&startupinfo,&pinfo))
    {
    MessageBox("create process error!");
    return;
    }
    CloseHandle(hWritePipe);
    while(true)
    {
    RtlZeroMemory(buffer,1024);
    if(ReadFile(hReadPipe,buffer,1023,&byteRead,NULL)==NULL)
    break;
    ::SendMessage(GetDlgItem(IDC_EDIT1)->m_hWnd,EM_SETSEL,-1,0);
    ::SendMessage(GetDlgItem(IDC_EDIT1)->m_hWnd,EM_REPLACESEL,false,(long)buffer);
    }
    CloseHandle(hReadPipe);
    m_Host.ReleaseBuffer();
      

  3.   

    我回过的,供参考
    为控制台程序输入输出重定向的问题 
    http://community.csdn.net/Expert/topic/3474/3474250.xml?temp=.3331568
      

  4.   

    用管道作为子进程的输出。然后你从管道里面去读他的输出数据就可以了。
    不显示子程序窗口,加上SW_HIDE属性即可。