Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.02.13;
Скачать: [xml.tar.bz2];

Вниз

Стандарный вывод (ввод) консольных приложений 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.02.13;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 8.273 c
3-1105955534
Максим
2005-01-17 12:52
2005.02.13
FireBird и SQL запрос


1-1107021755
Mixi
2005-01-29 21:02
2005.02.13
RasReader


14-1106750227
Гамлет
2005-01-26 17:37
2005.02.13
Где можно посмотреть исходники интернет-магазина?


3-1105615431
Junior
2005-01-13 14:23
2005.02.13
ADO или AccessApplication нужно добавить таблицу в .mdb


1-1106914623
TUser
2005-01-28 15:17
2005.02.13
Если не сложно - напишите ответ на 145й пост





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский