Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

В приведенном ниже коде создается консольный процесс с 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;
}

Ответ 3

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

Ответ 5

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