Newsgroup: it.comp.lang.delphi
Titolo: Lanciare e catturare prog DOS

Ciao a tutti,
ho la necessità di lanciare (in modo invisibile all'utente) un programma
esterno scritto in dos (e fin qui un TProcess basterebbe), ma... ho la
necessità di catturare l'output *riga per riga*: in tempo realte insomma.
Esempio:
Premo un button
Lancio "ping 
www.google.it
"
Il programma non si blocca, ma vedo in un Memo ogni riga che ho in output in
tempo reale e non tutto in blocco alla fine.
Cercando sul web ho trovato questo:
procedure LanciaComandoDosInMemo (ComandoDos: String; AMemo:TMemo);
const
   BufferDiLettura = 2400;
var
   AttrSicurezza : TSecurityAttributes;
   CodaDiLettura, CodaDiScrittura : THandle;
   Inizio : TStartUpInfo;
   InfoDelProcesso : TProcessInformation;
   Buffer : Pchar;
   ByteLetti : DWord;
   AppAttiva : DWord;
begin
     With AttrSicurezza do
      begin
       nlength := SizeOf(TSecurityAttributes);
       binherithandle := true;
       lpsecuritydescriptor := nil;
      end;
      if Createpipe (CodaDiLettura, CodaDiScrittura, @AttrSicurezza, 0) then
       begin
        Buffer := AllocMem(65536); // alloco memoria per 64k
        FillChar(Inizio, Sizeof(Inizio),#0);
        Inizio.cb := SizeOf(Inizio);
        Inizio.hStdOutput := CodaDiScrittura;
        Inizio.hStdInput := CodaDiLettura;
        Inizio.dwFlags := STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW;
        Inizio.wShowWindow := SW_HIDE;
        if CreateProcess(nil,
           PChar(ComandoDos),
           @AttrSicurezza,
           @AttrSicurezza,
           true,
           NORMAL_PRIORITY_CLASS,
           nil,
           nil,
           Inizio,
           InfoDelProcesso) then
        begin
         repeat
          AppAttiva := WaitForSingleObject(InfoDelProcesso.hProcess,100);
          Application.ProcessMessages;
          until (AppAttiva <> WAIT_TIMEOUT);
          Repeat
           ByteLetti := 0;
           ReadFile(CodaDiLettura,Buffer[0], BufferDiLettura,ByteLetti,nil);
           Buffer[ByteLetti]:= #0;
           OemToAnsi(Buffer,Buffer);
           AMemo.Text := AMemo.text + String(Buffer);
           //Form1.Memo1.Text := Form1.Memo1.text + String(Buffer);
           //AMemo.Lines.Append(String(Buffer));
          until (ByteLetti < BufferDiLettura);
        end;
       // libero la memoria
       FreeMem(Buffer);
       CloseHandle(InfoDelProcesso.hProcess);
       CloseHandle(InfoDelProcesso.hThread);
       CloseHandle(CodaDiLettura);
       CloseHandle(CodaDiScrittura);
      end;
end;
...
LanciaComandoDosInMemo ('ping 
www.google.it
', Memo1);
...
Che praticamente fa tutto: lancia il prog nascosto (o visibile se voglio),
non blocca il programma, scrive tutto in un memo, ma... non mi scrive riga
per riga :(
Mi sapete aiutare?
Ciao e grazie
PS Non voglio utilizzare componenti esterni :) 

 PS Non voglio utilizzare componenti esterni :) 
Puoi redirezionare l'output su un file da caricare nel memo al termine 
del programma.
Ciao,
Gianluca

 del programma.
No, un attimo... forse mi sono espresso male :)
Quello che vorrei fare č poter gestire ogni singola riga che mi viene 
generata in dos in tempo reale. Per restare nell'esempio del "ping" vorrei 
fare una cosa del tipo che ogni "pingata" e, quindi ogni riga, venga 
aggiunta ( .append() ) in un memo (o anche in una label... una riga per 
volta insomma).
Ciao :)