2009-07-26 2 views
1

Какой самый простой способ выполнить процесс, дождаться его завершения и затем вернуть его стандартный вывод в виде строки?Выполнение процесса и возврат его стандартного вывода в VC++

Kinda, как backtics в Perl.

Не требуется перекрестная платформа. Мне просто нужно самое быстрое решение для VC++.

Любые идеи?

ответ

4
решение

WinAPI:

Вы должны создать процесс (см CreateProcess) с перенаправлением ввода (hStdInput поля в структуре STARTUPINFO) и выходной (hStdOutput) для ваших труб (см CreatePipe), а затем просто читать из трубы (см. ReadFile).

+0

Это шокирует меня, что это самый простой способ делать backtics в VC .. http://msdn.microsoft.com/en-us/library/ms682499(VS.85).aspx Это сотни строк кода! –

2

хмм .. MSDN имеет это в качестве примера:

int main(void) 
{ 

    char psBuffer[128]; 
    FILE *pPipe; 

     /* Run DIR so that it writes its output to a pipe. Open this 
     * pipe with read text attribute so that we can read it 
     * like a text file. 
     */ 

    if((pPipe = _popen("dir *.c /on /p", "rt")) == NULL) 
     exit(1); 

    /* Read pipe until end of file, or an error occurs. */ 

    while(fgets(psBuffer, 128, pPipe)) 
    { 
     printf(psBuffer); 
    } 


    /* Close pipe and print return value of pPipe. */ 
    if (feof(pPipe)) 
    { 
    printf("\nProcess returned %d\n", _pclose(pPipe)); 
    } 
    else 
    { 
    printf("Error: Failed to read the pipe to the end.\n"); 
    } 
} 

Кажется достаточно просто. Просто нужно обернуть его добротой C++.

+4

Для цитирования из MSDN - «при использовании в программе Windows функция _popen возвращает недопустимый указатель на файл, который заставит программу зависать бесконечно». Он будет работать в консольных приложениях, если это будет полезно. – 2009-07-26 12:35:19

+0

Ну, консольные приложения действительно то, что я пытаюсь выполнить. Но ваш комментарий важен. Возможно, более надежное решение в порядке. –

+0

Нейл, на самом деле, я пробовал выше с «notepad.exe», и он просто ждет, пока я закрою блокнот и не вернусь ... –

Смежные вопросы