代码之家  ›  专栏  ›  技术社区  ›  Codename_DJ

将命令行进程的Stdout重定向到文件

  •  0
  • Codename_DJ  · 技术社区  · 11 年前

    我有一个MFC应用程序,它通过向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);
        }
    
        }
    

    但代码无法正常工作。只创建一个空白文件。 我做错了什么?请帮忙。

    1 回复  |  直到 11 年前
        1
  •  1
  •   Jabberwocky    11 年前

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

    改变

    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 ,有很多信息。

    顺便说一句,你也应该添加

    CloseProcess(piProcessInfo.hProcess)
    

    最后。