How do I redirect output to a file with CreateProcess?

前端 未结 5 2038
不思量自难忘°
不思量自难忘° 2020-11-27 19:52

I tried using CreateProcess to run a simple command like hg > test.txt. I tried running the string as a whole (as opposed to separating it into an applicatio

相关标签:
5条回答
  • 2020-11-27 20:02

    The code below creates a console-less process with stdout and stderr redirected to the specified file.

    #include <windows.h>
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        SECURITY_ATTRIBUTES sa;
        sa.nLength = sizeof(sa);
        sa.lpSecurityDescriptor = NULL;
        sa.bInheritHandle = TRUE;       
    
        HANDLE h = CreateFile(_T("out.log"),
            FILE_APPEND_DATA,
            FILE_SHARE_WRITE | FILE_SHARE_READ,
            &sa,
            OPEN_ALWAYS,
            FILE_ATTRIBUTE_NORMAL,
            NULL );
    
        PROCESS_INFORMATION pi; 
        STARTUPINFO si;
        BOOL ret = FALSE; 
        DWORD flags = CREATE_NO_WINDOW;
    
        ZeroMemory( &pi, sizeof(PROCESS_INFORMATION) );
        ZeroMemory( &si, sizeof(STARTUPINFO) );
        si.cb = sizeof(STARTUPINFO); 
        si.dwFlags |= STARTF_USESTDHANDLES;
        si.hStdInput = NULL;
        si.hStdError = h;
        si.hStdOutput = h;
    
        TCHAR cmd[]= TEXT("Test.exe 30");
        ret = CreateProcess(NULL, cmd, NULL, NULL, TRUE, flags, NULL, NULL, &si, &pi);
    
        if ( ret ) 
        {
            CloseHandle(pi.hProcess);
            CloseHandle(pi.hThread);
            return 0;
        }
    
        return -1;
    }
    
    0 讨论(0)
  • 2020-11-27 20:07

    you should run process cmd.exe with params "/c command line". This will redirect the output to a file or to organize a pipeline through CreateProcess.

    0 讨论(0)
  • 2020-11-27 20:10

    Microsoft has an example how to redirect the standard output: http://msdn.microsoft.com/en-us/library/ms682499(VS.85).aspx.

    0 讨论(0)
  • 2020-11-27 20:13

    CreateProcess() launches processes, it is not a command line itnerpreter. It doesn't know what ">" is and won't do the stream redirection for you. You need to open the file test.txt yourself and pass the handle to it to CreateProcess inside the STARTUPINFO structure: CreateProcess STARTUPINFO

    0 讨论(0)
  • 2020-11-27 20:14

    You can't use stdout redirection in the command line passed to CreateProcess. To redirect stdout you need to specify a file handle for the output in the STARTUPINFO structure.

    You are also making another, more subtle, mistake. The second parameter, lpCommandLine must point to writeable memory because CreateProcess overwrites the buffer. If you happen to be using the ANSI version of the function then you will get away with this, but not for the Unicode version.

    The Unicode version of this function, CreateProcessW, can modify the contents of this string. Therefore, this parameter cannot be a pointer to read-only memory (such as a const variable or a literal string). If this parameter is a constant string, the function may cause an access violation.

    0 讨论(0)
提交回复
热议问题