Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Перехват вывода консольной программы

301
19 ноября 2004 года
lord Kelvin
897 / / 08.11.2004
Моя задача: перезватить вывод консольной программы (cmd.exe) и вывести самому в своей программе.

Неудачное решение: скачать исходник из инета.

Вот код, который должен работать. (В чем дело? Если у кого-то есть рабочий исходник - жду не дождусь.)
Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 STARTUPINFO si;
 char c;
 unsigned long fs,rc;
 TProcessInformation pi;
 HANDLE tRead,cWrite;
 unsigned long  prh,exc;
 TSecurityAttributes sa;
 AnsiString result="";
 ZeroMemory(&si,sizeof(si));
 ZeroMemory(&pi,sizeof(pi));
 si.cb=sizeof(si);
 si.dwFlags=STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
 si.wShowWindow=SW_HIDE;

 sa.nLength=sizeof(sa);
 sa.lpSecurityDescriptor=NULL;
 sa.bInheritHandle=true;
 CreatePipe(&tRead,&cWrite,&sa,2048 );

 si.hStdInput=GetStdHandle(STD_INPUT_HANDLE);
 si.hStdError=cWrite;
 si.hStdOutput=cWrite;
 if(!CreateProcess(NULL,Edit1->Text.c_str(),NULL,NULL,true,0,NULL,NULL,&si,&pi))
 {
  CloseHandle(tRead);
  CloseHandle(cWrite);
  ShowError();
 }
 else
 {
  prh=(unsigned long)pi.hProcess;
  do
  {
   do
   {
    fs=GetFileSize(tRead,NULL);
    if(fs!=0)ReadFile(tRead,&c,1,&rc,NULL);
    result=result+c;
   }
   while(fs!=0);
   Sleep(0);
  }
  while(WaitForSingleObject(&prh,500)!=WAIT_OBJECT_0);
  GetExitCodeProcess(&prh,&exc);
  CloseHandle(tRead);
  CloseHandle(cWrite);
 }
 Memo1->Text=result;
}
301
20 ноября 2004 года
lord Kelvin
897 / / 08.11.2004
Итак. Решение я нашел. То что написано сверху - ошибка.=) Если кому интересно... Ну... вы знаете...=)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог