Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.13;
Скачать: CL | DM;

Вниз

Стандарный вывод (ввод) консольных приложений Windows   Найти похожие ветки 

 
Михаил М   (2004-12-24 00:16) [0]

Задача:
Необходимо запустить процесс и получать все строки посылаемые на стандартный вывод. Если возможно с примером...
Спасибо. 8)


 
имя   (2004-12-24 00:33) [1]

Удалено модератором


 
Yanis ©   (2004-12-24 00:40) [2]

To [1]
Поясни.


 
Yanis ©   (2004-12-24 00:41) [3]

Михаил М   (24.12.04 00:16)
Поясни.


 
AlterEgo of WondeRu ©   (2004-12-24 00:50) [4]

function ExecuteFile(FileName, StdInput: string;
 TimeOut: integer;
 var StdOutput: string): boolean;

label
 Error;

type
 TPipeHandles = (IN_WRITE, IN_READ,
   OUT_WRITE, OUT_READ,
   ERR_WRITE, ERR_READ);

type
 TPipeArray = array[TPipeHandles] of THandle;

var
 i: integer;
 ph: TPipeHandles;
 sa: TSecurityAttributes;
 Pipes: TPipeArray;
 StartInf: TStartupInfo;
 ProcInf: TProcessInformation;
 Buf: array[0..1024] of byte;
 TimeStart: TDateTime;

 function ReadOutput: string;
 var
   i: integer;
   s: string;
   BytesRead: longint;

 begin
   Result := "";
   repeat

     Buf[0] := 26;
     WriteFile(Pipes[OUT_WRITE], Buf, 1, BytesRead, nil);
     if ReadFile(Pipes[OUT_READ], Buf, 1024, BytesRead, nil) then
     begin
       if BytesRead > 0 then
       begin
         buf[BytesRead] := 0;
         s := StrPas(@Buf[0]);
         i := Pos(#26, s);
         if i > 0 then
           s := copy(s, 1, i - 1);
         Result := Result + s;
       end;
     end;

     if BytesRead1024 then
       break;
   until false;
 end;

begin
 Result := false;
 for ph := Low(TPipeHandles) to High(TPipeHandles) do
   Pipes[ph] := INVALID_HANDLE_VALUE;

 // Создаем пайпы
 sa.nLength := sizeof(sa);
 sa.bInheritHandle := TRUE;
 sa.lpSecurityDescriptor := nil;

 if not CreatePipe(Pipes[IN_READ], Pipes[IN_WRITE], @sa, 0) then
   goto Error;
 if not CreatePipe(Pipes[OUT_READ], Pipes[OUT_WRITE], @sa, 0) then
   goto Error;
 if not CreatePipe(Pipes[ERR_READ], Pipes[ERR_WRITE], @sa, 0) then
   goto Error;

 // Пишем StdIn
 StrPCopy(@Buf[0], stdInput + ^Z);
 WriteFile(Pipes[IN_WRITE], Buf, Length(stdInput), i, nil);

 // Хендл записи в StdIn надо закрыть - иначе выполняемая программа
 // может не прочитать или прочитать не весь StdIn.

 CloseHandle(Pipes[IN_WRITE]);

 Pipes[IN_WRITE] := INVALID_HANDLE_VALUE;

 FillChar(StartInf, sizeof(TStartupInfo), 0);
 StartInf.cb := sizeof(TStartupInfo);
 StartInf.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;

 StartInf.wShowWindow := SW_SHOW; // SW_HIDE если надо запустить невидимо

 StartInf.hStdInput := Pipes[IN_READ];
 StartInf.hStdOutput := Pipes[OUT_WRITE];
 StartInf.hStdError := Pipes[ERR_WRITE];

 if not CreateProcess(nil, PChar(FileName), nil,
   nil, True, NORMAL_PRIORITY_CLASS,
   nil, nil, StartInf, ProcInf) then
   goto Error;

 TimeStart := Now;

 repeat
   Application.ProcessMessages;
   i := WaitForSingleObject(ProcInf.hProcess, 100);
   if i = WAIT_OBJECT_0 then
     break;
   if (Now - TimeStart) * SecsPerDay > TimeOut then
     break;
 until false;

 if iWAIT_OBJECT_0 then
   goto Error;
 StdOutput := ReadOutput;

 for ph := Low(TPipeHandles) to High(TPipeHandles) do
   if Pipes[ph]INVALID_HANDLE_VALUE then
     CloseHandle(Pipes[ph]);

 CloseHandle(ProcInf.hProcess);
 CloseHandle(ProcInf.hThread);
 Result := true;
 Exit;

 Error:

 if ProcInf.hProcessINVALID_HANDLE_VALUE then

 begin
   CloseHandle(ProcInf.hThread);
   i := WaitForSingleObject(ProcInf.hProcess, 1000);
   CloseHandle(ProcInf.hProcess);
   if iWAIT_OBJECT_0 then

   begin
     ProcInf.hProcess := OpenProcess(PROCESS_TERMINATE,
       FALSE,
       ProcInf.dwProcessId);

     if ProcInf.hProcess 0 then
     begin
       TerminateProcess(ProcInf.hProcess, 0);
       CloseHandle(ProcInf.hProcess);
     end;
   end;
 end;

 for ph := Low(TPipeHandles) to High(TPipeHandles) do
   if Pipes[ph]INVALID_HANDLE_VALUE then
     CloseHandle(Pipes[ph]);

end;

delphiworld.narod.ru


 
Михаил М   (2004-12-24 21:36) [5]

AlterEgo of WondeRu
Спасибо. Это именно то что мне нужно. Однако я не совсем понял как работает данная функция... Не могли бы вы еще привести пример ее использования 8). Ну или хотя-бы пояснить за что отвечает парамтр StdInput...


 
Leonid Troyanovsky ©   (2004-12-25 17:14) [6]


> Михаил М   (24.12.04 00:16)  

> Необходимо запустить процесс и получать все строки посылаемые
> на стандартный вывод. Если возможно с примером...


http://groups.google.com/groups?selm=39A19369.AFCB1522%40eco-pro.ru

Брр.. Сколько много огрехов.
Тому, кто найдет хотя бы три (неповторяющихся) ошибки
(или, скажем, неточности) - подарю исправленный вариант.

--
С уважением, LVT.



Страницы: 1 вся ветка

Текущий архив: 2005.02.13;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.039 c
3-1105162091
va
2005-01-08 08:28
2005.02.13
БД - IntraWeb


3-1104235522
Некто
2004-12-28 15:05
2005.02.13
отсутствует свойство в IBTransaction


1-1106592290
e-statik
2005-01-24 21:44
2005.02.13
а ПОДСКАЖИТЕ компонент сплиттер чтоб ресайзить окна как в 3DMAXe?


1-1107176888
Andarkl
2005-01-31 16:08
2005.02.13
Курсор из файла?


14-1106583118
Кирилл
2005-01-24 19:11
2005.02.13
@ Dreamcast