【问题标题】:Redirecting Stdout of a commandline process to a file将命令行进程的标准输出重定向到文件
【发布时间】:2013-08-30 10:41:48
【问题描述】:

我有一个 MFC 应用程序,它通过 CreateProcess 函数向 cmd 发送命令。我想将标准输出放入日志文件。代码是这样的

    void CMainFrame::OnCompile( CString cmd )
    {
    CWaitCursor cursor;

    SECURITY_ATTRIBUTES sec;
    ZeroMemory( &sec, sizeof(sec) );
    sec.nLength = sizeof(SECURITY_ATTRIBUTES);
    sec.lpSecurityDescriptor = NULL;    
    sec.bInheritHandle = TRUE;

    HANDLE hstdoutf = CreateFile("e:\\user_stdout.txt",GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,&sec,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

    STARTUPINFO siStartupInfo;
    PROCESS_INFORMATION piProcessInfo;
    memset(&siStartupInfo, 0, sizeof(siStartupInfo));
    memset(&piProcessInfo, 0, sizeof(piProcessInfo));
    siStartupInfo.cb = sizeof(siStartupInfo);
    siStartupInfo.dwFlags = STARTF_USESHOWWINDOW  ;
    siStartupInfo.wShowWindow = SW_HIDE; 




    if (hstdoutf!=INVALID_HANDLE_VALUE) {
        siStartupInfo.hStdOutput=hstdoutf;
    }
    // Wait up to 100 seconds for the compilation process to finish
    if (!::CreateProcess(0, (char*)(cmd.GetString()), 0, 0, false,0, 0, 0,     
    &siStartupInfo, &piProcessInfo) ||
        (WaitForSingleObject(piProcessInfo.hProcess, 100000) != WAIT_OBJECT_0))
    {
        MessageBox("Fail to execute command","Test",MB_ICONERROR);
    }
    else
    {
        CloseHandle(hstdoutf);
    }

    }

但代码运行不正常。仅创建一个空白文件。 我做错了什么?请帮忙。

【问题讨论】:

    标签: mfc stdout createprocess


    【解决方案1】:

    您忘记在 siStartupInfo.dwFlags 中指定 STARTF_USESTDHANDLES 标志。

    改变

    startupInfo.dwFlags = STARTF_USESHOWWINDOW  ;
    

    startupInfo.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES ;
    

    改变

    CreateProcess(0, (char*)(cmd.GetString()), 0, 0, false, 0, 0, 0,
        &siStartupInfo, &piProcessInfo)
    

    CreateProcess(0, (char*)(cmd.GetString()), 0, 0, true, 0, 0, 0,
        &siStartupInfo, &piProcessInfo)
    

    我建议你阅读STARTUPINFO documentation 的STARTF_USESTDHANDLES 部分,有很多信息。

    顺便说一句,您还应该添加

    CloseProcess(piProcessInfo.hProcess)
    

    在最后。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-31
      • 1970-01-01
      • 1970-01-01
      • 2015-05-23
      • 1970-01-01
      相关资源
      最近更新 更多