Capture console output

Capture console output

offline
  • Pridružio: 04 Sep 2003
  • Poruke: 24135
  • Gde živiš: Wien

Opet ja sa mojim problemima. Ovaj put pokusavam da uhvatim poruke koje mi ispisuje aplikacija u konzoli i da doticne vratim u recimo Memo komponentu. Problem je sto je program koji se izvrsava u konzoli ustvari linux program kompajliran na Cygwinu. Neke rezultate sam vec ostvario, tj. kada konsolni program odradi svoje ja dobijem poruke koje je ispisao na ekranu u mojoj Memo komponenti (za to vreme se konzola ne vidi). Medjutim, poruke dobijem tek na kraju, sve odjednom, a ne periodicno kako se one ustvari pojavljuju na ekranu.

Evo koda koji sam koristio:
procedure TConsoleForm.RunCaptured(DosApp : string;AMemo : TMemo); const   ReadBuffer = 1048576;  // 1 MB Buffer var   Security            : TSecurityAttributes;   ReadPipe,WritePipe  : THandle;   start               : TStartUpInfo;   ProcessInfo         : TProcessInformation;   Buffer              : Pchar;   TotalBytesRead,   BytesRead           : DWORD;   Apprunning,n,   BytesLeftThisMessage,   TotalBytesAvail : integer; begin   with Security do   begin     nlength              := SizeOf(TSecurityAttributes);     binherithandle       := true;     lpsecuritydescriptor := nil;   end;   if CreatePipe (ReadPipe, WritePipe, @Security, 0) then   begin     Buffer  := AllocMem(ReadBuffer + 1);     FillChar(Start,Sizeof(Start),#0);     start.cb          := SizeOf(start);     start.hStdOutput  := WritePipe;     start.hStdInput   := ReadPipe;     start.dwFlags     := STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW;     start.wShowWindow := SW_HIDE;     if CreateProcess(nil      ,PChar(DosApp),                      @Security,@Security,                      true     ,CREATE_NO_WINDOW or NORMAL_PRIORITY_CLASS,                      nil      ,nil,                      start    ,ProcessInfo) then     begin       n:=0;       TotalBytesRead:=0;       repeat         Inc(n,1);                   Apprunning := WaitForSingleObject(ProcessInfo.hProcess,100);         Application.ProcessMessages;         if not PeekNamedPipe(ReadPipe        ,@Buffer[TotalBytesRead],                              ReadBuffer      ,@BytesRead,                              @TotalBytesAvail,@BytesLeftThisMessage) then break         else if BytesRead > 0 then           ReadFile(ReadPipe,Buffer[TotalBytesRead],BytesRead,BytesRead,nil);         TotalBytesRead:=TotalBytesRead+BytesRead;       until (Apprunning <> WAIT_TIMEOUT) or (n > 150) ;       Buffer[TotalBytesRead]:= #0;       OemToChar(Buffer,Buffer);       AMemo.Text := AMemo.text + StrPas(Buffer);     end;     FreeMem(Buffer);     CloseHandle(ProcessInfo.hProcess);     CloseHandle(ProcessInfo.hThread);     CloseHandle(ReadPipe);     CloseHandle(WritePipe);   end; Memo1.Text := AnsiReplaceStr(Memo1.Text, chr(10), (chr(13) + chr(10))); end; end.

Zadnja linija mi pretvara Linuxov kraj linije u Windowsow (CR > CR/LF).

Jel moze neko da mi pomogne da nateram ovo cudo da mi pokazuje poruke onda kada se pojave a ne tek na kraju?
Mislim da je problem bas u CR <=> CR/LF razlici.



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
Ko je trenutno na forumu
 

Ukupno su 695 korisnika na forumu :: 24 registrovanih, 2 sakrivenih i 669 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: A.R.Chafee.Jr., Aleksandar Tomić, aramis s, bbogdan, Bubimir, deimos25, draganl, DragoslavS, esx66, indja, janbo, kolle.the.kid, Koridor, ladro, Lazarus, loon123, maCvele, Mi lao shu, mrav pesadinac, nedeljkovici, procesor, RJ, SR-3m, stegonosa