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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.08.2019, 09:21   #1
zurot
 
Регистрация: 13.08.2019
Сообщений: 7
По умолчанию перехват вывода консоли

Всем привет, подскажите, делаю что то типа гуя для NSIS.
Требуется перехватить вывод из консоли makensis.exe для того что бы показать пользователю лог.

Запускаю компиляцию так:
Код:
        CaptureConsoleOutput(extractfilepath(application.ExeName) +'nsis\makensis.exe', extractfilepath(application.ExeName) +'nsis\script.nsi');
Код:
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
          dRead := 0;
          ReadFile(hRead, pBuffer[0], CReadBuffer, dRead, nil);
          pBuffer[dRead] := #0;

          OemToAnsi((pBuffer), (pBuffer));

          ClientBilderForm.BuildLogMemo.Lines.Add(String(pBuffer));

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

    CloseHandle(hRead);
    CloseHandle(hWrite);
  end;
end;
Все работает нормально, но если добавить в установочный пакет что то "подозрительное" по мнению защитника windows моя форма намертво виснит.
Почему так происходит и как избавится от данного эфекта и вернуть управление форме? Вывести сообщение об ошибке или что то в этом роде...

Последний раз редактировалось zurot; 13.08.2019 в 09:25.
zurot вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Си++ Функции ввода-вывода с консоли Karina* Помощь студентам 0 27.04.2012 18:38
Перехват ошибок ввода-вывода _-Re@l-_ C# (си шарп) 10 19.01.2012 09:22
Запуск консоли и перенаправление вывода ros.pro Общие вопросы Delphi 1 02.01.2012 18:49
Перехват вывода Яр|/||< (^_^) Win Api 5 02.02.2011 23:08
Перехват сообщения от консоли (cmd.exe) volod3000 Win Api 2 04.02.2009 09:29