Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как захватить весь вывод в консоли? 
:(
    Опции темы
Pakshin A. S.
Дата 5.11.2004, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: нет
Всего: 61



Код

unit consoleoutput;  

interface 

uses 
  Controls, Windows, SysUtils, Forms; 

function GetDosOutput(const CommandLine:string): string; 

implementation 

function GetDosOutput(const CommandLine:string): string; 
var 
  SA: TSecurityAttributes; 
  SI: TStartupInfo; 
  PI: TProcessInformation; 
  StdOutPipeRead, StdOutPipeWrite: THandle; 
  WasOK: Boolean; 
  Buffer: array[0..255] of Char; 
  BytesRead: Cardinal; 
  WorkDir, Line: String; 
begin 
  Application.ProcessMessages; 
  with SA do 
  begin 
    nLength := SizeOf(SA); 
    bInheritHandle := True; 
    lpSecurityDescriptor := nil; 
  end; 
  // создаём пайп для перенаправления стандартного вывода 
  CreatePipe(StdOutPipeRead,  // дескриптор чтения 
             StdOutPipeWrite, // дескриптор записи 
             @SA,              // аттрибуты безопасности 
             0                // количество байт принятых для пайпа - 0 по умолчанию 
             ); 
  try 
    // Создаём дочерний процесс, используя StdOutPipeWrite в качестве стандартного вывода, 
    // а так же проверяем, чтобы он не показывался на экране. 
    with SI do 
    begin 
      FillChar(SI, SizeOf(SI), 0); 
      cb := SizeOf(SI); 
      dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES; 
      wShowWindow := SW_HIDE; 
      hStdInput := GetStdHandle(STD_INPUT_HANDLE); // стандартный ввод не перенаправляем 
      hStdOutput := StdOutPipeWrite; 
      hStdError := StdOutPipeWrite; 
    end; 

    // Запускаем компилятор из командной строки 
    WorkDir := ExtractFilePath(CommandLine); 
    WasOK := CreateProcess(nil, PChar(CommandLine), nil, nil, True, 0, nil, PChar(WorkDir), SI, PI); 

    // Теперь, когда дескриптор получен, для безопасности закрываем запись. 
    // Нам не нужно, чтобы произошло случайное чтение или запись. 
    CloseHandle(StdOutPipeWrite);  
    // если процесс может быть создан, то дескриптор, это его вывод 
    if not WasOK then 
      raise Exception.Create('Could not execute command line!') 
    else 
      try 
        // получаем весь вывод до тех пор, пока DOS-приложение не будет завершено 
        Line := ''; 
        repeat 
          // читаем блок символов (могут содержать возвраты каретки и переводы строки) 
          WasOK := ReadFile(StdOutPipeRead, Buffer, 255, BytesRead, nil); 

          // есть ли что-нибудь ещё для чтения? 
          if BytesRead > 0 then 
          begin 
            // завершаем буфер PChar-ом 
            Buffer[BytesRead] := #0; 
            // добавляем буфер в общий вывод 
            Line := Line + Buffer; 
          end; 
        until not WasOK or (BytesRead = 0); 
        // ждём, пока завершится консольное приложение 
        WaitForSingleObject(PI.hProcess, INFINITE); 
      finally 
        // Закрываем все оставшиеся дескрипторы 
        CloseHandle(PI.hThread); 
        CloseHandle(PI.hProcess); 
      end; 
  finally 
      result:=Line; 
      CloseHandle(StdOutPipeRead); 
  end; 
end; 


end. 

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0448 ]   [ Использовано запросов: 23 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.