Главная страница
    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.041 c
14-1106564058
Vlad Oshin
2005-01-24 13:54
2005.02.13
Не напомните в каком windows и где лежит интерпретатор basic?


14-1106479264
Чеширский_Кот
2005-01-23 14:21
2005.02.13
Нужна фотография Шевченки


1-1106988265
Hadroran
2005-01-29 11:44
2005.02.13
SYSDBA --> masterkey


1-1106986978
m52
2005-01-29 11:22
2005.02.13
Проблема со скроллингом в ListView


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