Использование дескриптора для сбора выходных данных из CreateProcess () - PullRequest
10 голосов
/ 20 апреля 2010

Я использую CreateProcess () для запуска внешнего консольного приложения в Windows из моего приложения с графическим интерфейсом. Я хотел бы как-то собрать вывод, чтобы знать, были ли ошибки. Теперь я знаю, что должен что-то делать с hStdOutput, но я не понимаю, что. Я новичок в C ++ и неопытный программист, и я на самом деле не знаю, что делать с ручкой или как зажечь трубу.

Как мне получить выходные данные для некоторой переменной (или файла)?

Это то, что у меня есть в данный момент:

void email::run(string path,string cmd){


    WCHAR * ppath=new(nothrow) WCHAR[path.length()*2];
    memset(ppath,' ',path.length()*2);
    WCHAR * pcmd= new(nothrow) WCHAR[cmd.length()*2];
    memset(pcmd,' ',cmd.length()*2);

    string tempstr;


    ToWCHAR(path,ppath);  //creates WCHAR from my std::string
    ToWCHAR(cmd,pcmd);

    STARTUPINFO info={sizeof(info)};
    info.dwFlags = STARTF_USESHOWWINDOW;    //hide process

    PROCESS_INFORMATION processInfo;

    if (CreateProcess(ppath,pcmd, NULL, NULL, FALSE, 0, NULL, NULL, &info, &processInfo))
        {
        ::WaitForSingleObject(processInfo.hProcess, INFINITE);

        CloseHandle(processInfo.hProcess);
        CloseHandle(processInfo.hThread);
        }

    delete[](ppath);
    delete[](pcmd);
}

Этот код, вероятно, заставляет кричать любого приличного программиста, но (я бы даже не сказал :) Это работает; -)

Вопрос: Как использовать hStdOutput для чтения вывода в файл (например)?

1 Ответ

3 голосов
/ 24 апреля 2013

В базе знаний Microsoft есть пример, который демонстрирует, как получить выходные данные дочернего процесса консоли. Основной принцип заключается в том, что родительский процесс создает каналы (по одному на стандартный дескриптор для перенаправления) и передает дескрипторы CreateProcess.

Дочерний процесс не нужно изменять, чтобы это работало, что важно, если у вас нет контроля над дочерним источником.

Дополнительная информация: Как порождать процессы консоли с помощью перенаправленных стандартных дескрипторов

...