Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Сокровищница
  
 

Фильтр по датам

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  05:13[Войти] | [Зарегистрироваться]

Перенаправление вывода консольной программы

Черевко Сергей
дата публикации 02-06-2003 15:03

Перенаправление вывода консольной программы

Понадобилось мне отобразить работу консольной программы в каком-нибудь Memo, а саму консоль не показывать. Поискал в инете - много кто ищет, мало кто предлагает готовые решения. Понял только, что плясать надо с "пайпами". Взял свой парадный бубен и... Вовремя подвернулась хорошая статья в тему на КД:
"StdIn, StdOut и StdErr. Перенаправление, чтение и запись" автор Горбань С.В.
Но мне не нужен целый класс! Да и собственные наработки уже появились. Вообщем, не буду утомлять процессом поисков и метаний, просто скажу что получилось. А получилась следующая функция:

function RunAny(CommandLine: string; Str: TStrings): boolean;
var
   I: byte;
   S: string;
   Flag: boolean;
   tRead, cWrite, dwRead, dwAvail: cardinal;
   SA: TSecurityAttributes;
   PI: TProcessInformation;
   SI: TStartupInfo;
begin
   Result:=False;
   SA.nLength:=SizeOf(SECURITY_ATTRIBUTES);
   SA.bInheritHandle:=True;
   SA.lpSecurityDescriptor:=nil;
   if not CreatePipe(tRead, cWrite, @SA, 0) then Exit;
   ZeroMemory(@SI, SizeOf(TStartupInfo));
   SI.cb:=SizeOf(TStartupInfo);
   SI.dwFlags:=STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
   SI.wShowWindow:=SW_HIDE;
   SI.hStdOutput:=cWrite;
   if CreateProcess(nil, PChar(CommandLine), nil, nil, True, 0, nil, nil, SI, PI) then begin
      CloseHandle(PI.hProcess);
      CloseHandle(PI.hThread);
      Str.Clear();
      Flag:=True;
      while Flag do begin
         for I:=0 to 9 do begin
            PeekNamedPipe(tRead, nil, 0, nil, @dwAvail, nil);
            if (dwAvail>0) then begin
               Flag:=True;
               Break;
            end
            else Flag:=False;
            Sleep(100);
         end; //for I:=
         if dwAvail>0 then begin
            SetLength(S, dwAvail);
            ReadFile(tRead, PChar(S)^, Length(S), dwRead, Nil);
            OemToChar(PChar(S), PChar(S));
            Str.Add(S);
            Application.ProcessMessages;
            Result:=True;
         end; // if dwAvail
      end;    // while Flag
   end;       // if CreateProcess
end;

Вот. Может кому пригодится. Естественно пока не причесано, но спешу поделиться :-)

P.S. Автор упомянутой статьи писал, что не пошло у него с format. Да, действительно, такая проблема существует. Под win98SE у меня так и не получилось с тем же format''ом и рядом архиваторов, таких как RAR 2.0 и ARJ 2.50. Однако, под WIN200 PROF RUS все решилось небольшим изменением:
CommandLine:=''cmd.exe /c ''+CommandLine 
- и телемаркет!
Работает даже с bat-файлом.




Смотрите также материалы по темам:
[Ввод/вывод (StdIn/StdOut)]

 Обсуждение материала [ 15-08-2012 11:45 ] 10 сообщений
  
Время на сайте: GMT минус 5 часов

Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
Функция может не работать в некоторых версиях броузеров.

Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

 
© При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
Все используемые на сайте торговые марки являются собственностью их производителей.

Яндекс цитирования