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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.06.2019, 16:53   #1
niockasd
Пользователь
 
Регистрация: 01.12.2015
Сообщений: 82
По умолчанию Запуск консольного приложения с выводом результата

Народ.. Нашел такой код в сети
Код:
procedure CaptureConsoleOutput(const ACommand, AParameters: String);
const
  CReadBuffer = 2400;
var
  saSecurity: TSecurityAttributes;
  hRead: THandle;
  hWrite: THandle;
  suiStartup: TStartupInfo;
  piProcess: TProcessInformation;
  pBuffer: array [0 .. CReadBuffer] of ansiChar;
  dRead: DWord;
  dRunning: DWord;
begin
  saSecurity.nLength := SizeOf(TSecurityAttributes);
  saSecurity.bInheritHandle := true;
  saSecurity.lpSecurityDescriptor := nil;

  if CreatePipe(hRead, hWrite, @saSecurity, 0) then
  begin
    FillChar(suiStartup, SizeOf(TStartupInfo), #0);
    suiStartup.cb := SizeOf(TStartupInfo);
    suiStartup.hStdInput := hRead;
    suiStartup.hStdOutput := hWrite;
    suiStartup.hStdError := hWrite;
    suiStartup.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
    suiStartup.wShowWindow := SW_HIDE;

    if CreateProcess(nil, PChar(ACommand + ' ' + AParameters), @saSecurity,
      @saSecurity, true, NORMAL_PRIORITY_CLASS, nil, nil, suiStartup, piProcess)
    then
    begin
      repeat
        dRunning := WaitForSingleObject(piProcess.hProcess, 100);
        application.ProcessMessages();
        repeat       application.ProcessMessages();
          dRead := 0;
          ReadFile(hRead, pBuffer[0], CReadBuffer, dRead, nil);
          pBuffer[dRead] := #0;

          OemToAnsi((pBuffer), (pBuffer));

          form1.Memo1.Lines.Add(String(pBuffer));

        until (dRead < CReadBuffer);
      until (dRunning <> WAIT_TIMEOUT);
      CloseHandle(piProcess.hProcess);
      CloseHandle(piProcess.hThread);
    end;

    CloseHandle(hRead);
    CloseHandle(hWrite);
  end;
end;
в принципе работает, но если убить из диспетчера приложение которое открывается то моя форма остается в подвешенном состоянии.

Как правильно выйти из цикла если приложение которое было запущено умерло ?

Пробовал в цикл воткнуть проверку типа
Код:
    if GetProcessByEXE(ExtractFileName( ACommand ))=0 then exit;
но все равно не отживает...

Последний раз редактировалось niockasd; 19.06.2019 в 17:01.
niockasd вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с поиском и выводом результата Brok[BS] Общие вопросы C/C++ 4 18.01.2011 20:16
Запуск консольного приложения через форму GrifoNjkeee Общие вопросы C/C++ 0 08.11.2010 17:02
Запуск консольного приложения в том же окне DarkEvil Общие вопросы Delphi 1 04.12.2009 20:44
проблема с выводом результата Nyutka PHP 2 16.04.2009 11:58
калькулятор с выводом результата в файл yori Помощь студентам 7 27.01.2009 18:40