Главная страница
    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
Время: 0.037 c
1-1107060557
PZ
2005-01-30 07:49
2005.02.13
Модераторам форума


1-1107267779
Руслана
2005-02-01 17:22
2005.02.13
Подскажите как узнать символ сепаратора для даты


14-1106592053
netnetnet
2005-01-24 21:40
2005.02.13
UPX


3-1105688493
TSa
2005-01-14 10:41
2005.02.13
Поключиться к БД MySQL в INTERNET


14-1106230703
Alexander Panov
2005-01-20 17:18
2005.02.13
Питерцы, старый телевизор нужен?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский