Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.02.2010, 00:54   #1
hotcooler17
Пользователь
 
Регистрация: 06.01.2009
Сообщений: 34
Печаль Вывод из консоли в Memo

Есть проблема. Имеется консольная прога и нужно написать GUI + анализ результатов работы проги. Прога(консольная) есть в исходниках, однако вмешательство в ее код нежелательно. Но у проги есть недочет: в случае, когда вводимые данные(имя файла) содержат ошибку, или результат поиска по файлу не дал результатов - прога ничего не выводит!

Код:
procedure RunDosInMemo(CmdLine:String;Output:TStrings);
 const
   ReadBuffer = 2400;
 var
  Security       : TSecurityAttributes;
  ReadPipe,WritePipe  : THandle;
  start        : TStartUpInfo;
  ProcessInfo     : TProcessInformation;
  Buffer        : Pchar;
  BytesRead      : DWord;
  Apprunning      : DWord;
 begin
  Screen.Cursor:=CrHourGlass;
  With Security do begin
  nlength        := SizeOf(TSecurityAttributes);
  binherithandle    := true;
  lpsecuritydescriptor := nil;
  end;
  if Createpipe (ReadPipe, WritePipe,
         @Security, 0) then begin
  Buffer  := AllocMem(ReadBuffer + 1);
  FillChar(Start,Sizeof(Start),#0);
  start.cb      := SizeOf(start);
  start.hStdOutput  := WritePipe;
  start.hStdInput  := ReadPipe;
  start.dwFlags   := STARTF_USESTDHANDLES +
             STARTF_USESHOWWINDOW;
  start.wShowWindow := SW_HIDE;
  if CreateProcess(nil,
      PChar(CmdLine),
      @Security,
      @Security,
      true,
      NORMAL_PRIORITY_CLASS,
      nil,
      nil,
      start,
      ProcessInfo)
  then
  begin
   repeat
   Apprunning := WaitForSingleObject
          (ProcessInfo.hProcess,100);
    ReadFile(ReadPipe,Buffer[0],
       ReadBuffer,BytesRead,nil);
    Buffer[BytesRead]:= #0;
    OemToAnsi(Buffer,Buffer);
    Output.Text := Output.Text + String(Buffer);
   Application.ProcessMessages;
   until (Apprunning <> WAIT_TIMEOUT);
  end;
  FreeMem(Buffer);
  CloseHandle(ProcessInfo.hProcess);
  CloseHandle(ProcessInfo.hThread);
  CloseHandle(ReadPipe);
  CloseHandle(WritePipe);
  end;
  Screen.Cursor:=CrDefault;
 end;
Соответственно в этом месте программа встает. Как быть?
hotcooler17 вне форума Ответить с цитированием
Старый 05.02.2010, 02:52   #2
maxionans
Форумчанин
 
Аватар для maxionans
 
Регистрация: 02.01.2010
Сообщений: 254
По умолчанию

Либо вместо CreatePipe используй CreateNamedPipe с флагом FILE_FLAG_OVERLAPPED и дальше работай с ним через ReadFileEx/WriteFileEx (предварительно придется тщательно ознакомиться, что такое Overlapped mode у всех этих функций), либо выноси код обработки данных в поток и используй таймаут для определения того, завис поток или нет (если завис - значит данных нет). Второй способ гораздо проще.
maxionans вне форума Ответить с цитированием
Старый 05.02.2010, 11:08   #3
hotcooler17
Пользователь
 
Регистрация: 06.01.2009
Сообщений: 34
По умолчанию

Честно говоря, не очень дружу с потоками. Как передать параметры в поток и забрать назад?
hotcooler17 вне форума Ответить с цитированием
Старый 05.02.2010, 20:51   #4
hotcooler17
Пользователь
 
Регистрация: 06.01.2009
Сообщений: 34
По умолчанию

Так, я чуть разобрался и понял, что вынести в отдельный поток не удастся. Вернее это возможно, но тогда функция будет полна бесконечных циклов с sleep =) А вот с Named Pipe что-то не получается - не удается его создать. Можно пример именно для перенаправления вывода консоли, если не затруднит?
===================
А нет, все получилось. Все, проблему решил.

Последний раз редактировалось hotcooler17; 06.02.2010 в 00:20.
hotcooler17 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Читает вывод из консоли Consol Win Api 10 31.08.2009 08:42
Как захватить весь вывод в консоли??? alexfmf Общие вопросы Delphi 5 13.05.2009 21:54
Вывод в Memo Siluet Общие вопросы Delphi 18 17.04.2009 19:49
Вывод в консоли на русском языке символов prikolist Общие вопросы C/C++ 8 06.04.2009 18:52
вывод в Memo под курсором Aleksandar Компоненты Delphi 5 22.10.2008 22:43