Как перенаправить вывод в файл с CreateProcess?

Я попытался использовать CreateProcess для запуска простой команды, такой как hg > test.txt. Я попытался запустить строку в целом (в отличие от разделения ее на имя приложения и его параметры). Почему CreateProcess(0, "notepad.exe test.txt", ...) работать, но CreateProcess(0, "hg > test.txt", ...) не?

5 ответов


вы не можете использовать перенаправление stdout в командной строке перешел к CreateProcess. Для перенаправления вывода нужно указать дескриптор файла для вывода в тег STARTUPINFO структура.

вы также совершаете другую, более тонкую ошибку. Второй параметр, lpCommandLine должен указывать на записываемую память, потому что CreateProcess перезаписывает буфер. Если вы используете версию функции ANSI, вам это сойдет с рук, но не для Unicode версия.

версия этой функции в Юникоде,CreateProcessW, можно изменить содержимое этой строки. Следовательно, этот параметр не может быть указателем на память только для чтения (например, const переменная или строковый литерал). Если этот параметр является постоянной строкой, функция может вызвать нарушение прав доступа.


приведенный ниже код создает процесс без консоли с перенаправлением stdout и stderr в указанный файл.

#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;
}

CreateProcess () запускает процессы, это не командная строка itnerpreter. Он не знает, что такое">", и не будет выполнять перенаправление потока для вас. Вам нужно открыть файл test.txt себя и передать дескриптор к нему CreateProcess внутри структуры STARTUPINFO: является CreateProcess STARTUPINFO


компания Microsoft пример как перенаправить стандартный вывод: http://msdn.microsoft.com/en-us/library/ms682499 (VS.85).aspx.


вы должны запустить процесс cmd.exe с параметром "/ c командной строки". Это перенаправит вывод в файл или организует конвейер через CreateProcess.