Как перенаправить вывод в файл с помощью CreateProcess? - PullRequest
24 голосов
/ 11 августа 2011

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

Ответы [ 5 ]

23 голосов
/ 27 апреля 2013

Приведенный ниже код создает процесс без консоли с перенаправлением 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;
}
23 голосов
/ 11 августа 2011

Нельзя использовать перенаправление стандартного вывода в командной строке, переданной в CreateProcess. Чтобы перенаправить стандартный вывод, необходимо указать дескриптор файла для вывода в структуре STARTUPINFO.

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

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

8 голосов
/ 11 августа 2011

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

7 голосов
/ 11 августа 2011

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

0 голосов
/ 21 августа 2013

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

...