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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.05.2009, 10:55   #1
alexfmf
 
Регистрация: 02.03.2009
Сообщений: 9
По умолчанию Как захватить весь вывод в консоли???

Уважаемые программисты, выручайте!
Суть проблемы: я из делфи запускаю паскалевский компилятор (TPC.EXE) для выполнения фала (*.pas), чтобы получить (*.ехе) с помощью такого кода:
Код:
WinExec(PChar('{Здесь директория компилятора} - E {Здесь полное имя файла *.pas} '), SW_SHOWNORMAL);
При этом информация о ходе компиляции отображается в консоли. Как счтать всю инфу из консоли????

Я нашел такую функцию:

Как захватить весь вывод в консоли
Код:
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.
Я, мягко говоря, в программировании новичек! Объясните. люди добрые, как считать инфу из консоли, образованной паскалевским компилятором?... Пожалуйста!

Последний раз редактировалось alexfmf; 12.05.2009 в 11:10.
alexfmf вне форума Ответить с цитированием
Старый 12.05.2009, 11:20   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Как счтать всю инфу из консоли????
Я бы сначала скомпилировал, а потом перенаправлением в файл запустил экзешник:
Код:
proga.exe > out.txt
после отработки экзешника все что должно было быть в консоли будет в out.txt.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.05.2009, 11:26   #3
alexfmf
 
Регистрация: 02.03.2009
Сообщений: 9
По умолчанию

хм... а если экзэшник не создается, в консоли прописана ошибка. Мне нужно ошибку прочитать...
Как тогда???
alexfmf вне форума Ответить с цитированием
Старый 12.05.2009, 12:48   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Чего не знаю того не знаю )
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.05.2009, 21:46   #5
alexfmf
 
Регистрация: 02.03.2009
Сообщений: 9
По умолчанию

К кому бы обратиться?
Ведь, как говорил великий Канфуций ещё задолго до распятия Хриса:
"На ДЕЛФИ нерешабельных задач не существует!".
alexfmf вне форума Ответить с цитированием
Старый 13.05.2009, 21:54   #6
Hottabych
Форумчанин
 
Регистрация: 13.01.2008
Сообщений: 140
По умолчанию

Шутка: сделай скриншот экрана, напиши распознавалку и сохрани текст в файл
Hottabych вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как программно развернуть форму на весь экран? chandrasecar Общие вопросы Delphi 6 26.07.2015 10:39
Вывод в консоли на русском языке символов prikolist Общие вопросы C/C++ 8 06.04.2009 18:52
Как програмно заставить приложение развернуться на весь экран SibBear Общие вопросы Delphi 2 19.03.2009 13:57
захватить звуковой поток с аудиокарты Gorychev Свободное общение 10 18.04.2008 23:15
Как развернуть проигрываемый видео файл на весь екран SeRhy Мультимедиа в Delphi 2 26.01.2008 21:43