Выполнить процесс и вернуть его стандартный вывод в VC++

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

Вроде как backtics в Perl.

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

Есть идеи?


person Assaf Lavie    schedule 26.07.2009    source источник


Ответы (2)


WinAPI-решение:

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

person Mad Fish    schedule 26.07.2009
comment
Меня шокирует тот факт, что это самый простой способ сделать обратную связь в VC. nofollow noreferrer">msdn.microsoft.com/en-us/library/ms682499(VS.85).aspx Это сотни строк кода! - person Assaf Lavie; 26.07.2009

хм .. 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");
   }
}

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

person Assaf Lavie    schedule 26.07.2009
comment
Цитата из MSDN: при использовании в программе Windows функция _popen возвращает недопустимый указатель файла, что приведет к зависанию программы на неопределенный срок. Он будет работать в консольных приложениях, если это будет полезно. - person ; 26.07.2009
comment
Что ж, консольные приложения — это действительно то, что я пытаюсь выполнить. Но ваш комментарий важен ... может быть, нужно более надежное решение. - person Assaf Lavie; 26.07.2009
comment
Нил, на самом деле, я попробовал то же самое с notepad.exe, и он просто ждет, пока я закрою блокнот, и вернется... - person Assaf Lavie; 26.07.2009
comment
Это не то, что это значит. Это означает, что вы не можете использовать popen() внутри приложения с графическим интерфейсом Windows. Вы можете использовать его для запуска приложения с графическим интерфейсом из консольного приложения. - person ; 26.07.2009