Newsgroup: it.comp.lang.delphi
Titolo: CreateProcess ed output

Salve!
Avrei il seguente quesito :
voglio eseguire un programmino 'prova.exe' di tipo applicazione
console che genera un sempliec output testuale da un altro programma
delphi, mediante la CreateProcess.
Il bello sarebbe riuscire a reindirizzare l'output (stdOutput) e gli
eventuali errori (stdError) su una console gestita da me o anche su
dei file di testo.
A tale scopo ho seguito le indicazioni dell'help ed uso il flag
STARTF_USESTDHANDLES e gli passo l'handle del file o del processo
della console dove indirizzare l'ouput...senza nessun risultato. 
Il programma esterno viene eseguito correttamente, la CreateProcess
restituisce un handle valido, ma non ottengo nessun output ne su file
ne sulla console aperta in precedenza.
Qualche consiglio?
grazie1000000,
Matteo
------------------------
http://www.genhome.org
codice : -----------------------------------------------------------
procedure main
begin
  h:=0;
  p:=0;
  filename :='.\output.txt';
  p:=CreateFile(PChar(filename), GENERIC_WRITE,
                FILE_SHARE_WRITE, nil,
                CREATE_ALWAYS,  FILE_ATTRIBUTE_ARCHIVE,
	   0);
  proc_name   := ExtractFilePath(APplication.ExeName)+'cmd.exe';
  proc_string := '';
  h:=EseguiProcesso(STARTF_USESTDHANDLES,
                    p,
                    PChar(proc_name),
                    PChar(proc_string));
  closeHandle(p);
end;                    
function EseguiProcesso(FLAGS : word; hPadre : THandle;
nome_file:PChar; parametri:PChar) : THandle;
Var stupinfo : TStartUpInfo;
    info     : TProcessInformation; 
    hstatus  : boolean;              
begin
  stupinfo.lpReserved      := nil;
  stupinfo.lpDesktop       := nil;
  stupinfo.lpTitle         := nil;
  stupinfo.lpReserved2     := nil;
  stupinfo.cbReserved2     := 0;
  stupinfo.cb              := sizeof(stupinfo);
  stupinfo.dwX             := 0;
  stupinfo.dwY             := 0;
  stupinfo.dwXSize         := 0;
  stupinfo.dwYSize         := 0;
  stupinfo.dwXCountChars   := 0;
  stupinfo.dwYCountChars   := 0;
  stupinfo.dwFillAttribute := 0;
  stupinfo.dwFlags         := FLAGS;
  stupinfo.wShowWindow     := 0;
  stupinfo.hStdInput       := hPadre;
  stupinfo.hStdOutput      := hPadre;
  stupinfo.hStdError       := hPadre;
  hstatus:=CreateProcess(nome_file,
                         parametri,
                         nil,
                         nil,
                         FALSE,     
                         0,       
                         nil,      
                         nil,      
                         stupInfo, 
                         info);    
  Result := info.hProcess;
end;

dei file di testo.
[...]
E` stato postato il codice per questa cosa un pò di tempo fa.
-- 
Andrea Laforgia
Open Delphi Manual
http://groups.yahoo.com/group/delphi_open_manual/

Mi rispondo da solo.
Prova e riprova ho cambiato completamente il codice ed ora funziona,
apro un applicazione e riesco a passargli input ed a leggere output ed
error.
Posto di seguito il codice se a qualcuno può servire.
Ciao!
Matteo
---------
procedure TmainForm.CreaFileHandle(Var hin,hout,herr : THandle);
Var secAtt       : TSecurityAttributes;
    filename : string;
Begin
  FillChar(SecAtt, SizeOf(SecAtt), #0);
  secAtt.nLength              := sizeof(secAtt);
  secAtt.lpSecurityDescriptor := nil;
  secAtt.bInheritHandle       := TRUE;
  filename :='out.txt';
  hOUT:=CreateFile(PChar(filename),
                   GENERIC_READ OR GENERIC_WRITE,
                   FILE_SHARE_READ OR FILE_SHARE_WRITE,
                   @secAtt,
                   CREATE_ALWAYS,
                   FILE_ATTRIBUTE_ARCHIVE,
                   0);
  if hOUT=0 then begin
    ShowMessage('Errore in creazione output');
    halt(666);
  End;
  filename :='err.txt';
  hERR:=CreateFile(PChar(filename),
                   GENERIC_READ OR GENERIC_WRITE,
                   FILE_SHARE_READ OR FILE_SHARE_WRITE,
                   @secAtt,
                   CREATE_ALWAYS,
                   FILE_ATTRIBUTE_ARCHIVE,
                   0);
  if hERR=0 then begin
    ShowMessage('Errore in creazione error');
    halt(666);
  End;
  filename :='in.txt';
  hIN:=CreateFile(PChar(filename),
                   GENERIC_READ OR GENERIC_WRITE,
                   FILE_SHARE_READ OR FILE_SHARE_WRITE,
                   @secAtt,
                   OPEN_ALWAYS,
                   FILE_ATTRIBUTE_ARCHIVE,
                   0);
  if hIN=0 then begin
    ShowMessage('Errore in creazione error');
    halt(666);
  End;
End;
procedure TmainForm.BitBtn1Click(Sender: TObject);
Var proc_name,
    proc_string  : string;
    pIN,pOUT,pERR: THandle;
    stupInfo     : TStartUpInfo;
    info         : TProcessInformation;  //  come stà il processo ???
    hstatus      : boolean;              //  stato del processo
begin
  CreaFileHandle(pIN,pOUT,pERR);
  FillChar(stupInfo, SizeOf(stupInfo), #0);
  stupinfo.cb              := sizeof(stupinfo);
  stupinfo.dwFlags         := STARTF_USESTDHANDLES;
  stupinfo.wShowWindow     := 0;
  stupinfo.hStdInput       := pIN;
  stupinfo.hStdOutput      := pOUT;
  stupinfo.hStdError       := pERR;
  proc_name   := '.\cmd.exe';
  proc_string := '';
  hstatus:=CreateProcess(PChar(proc_name),
                         nil,      //
                         nil,      // process security flags
                         nil,      // thread security flags
                         TRUE,     //
                         0,        //
                         nil,      // variabili d'ambiente
                         nil,      // drive e dir correnti per il
processo
                         stupInfo, //
                         info);    //
  if hstatus then begin
    WaitForSingleObject(info.hProcess,INFINITE);
  end
  else begin
    showMessage('CreateProcess ERROR'+#13#10+
                'pIN    : ' + IntToSTr(pIN)+#13#10 +
                'pOUT   : ' + IntToSTr(pOUT)+#13#10 +
                'pERR   : ' + IntToSTr(pERR)+#13#10 +
                'Figlio : ' + IntToSTr(info.hProcess));
  end;
  // chiudo gli handle
  if pIN<>0 then
    closeHandle(pIN);
  if pOUT<>0 then
    closeHandle(pOUT);
  if pERR<>0 then
    closeHandle(pERR);
  if info.hProcess<>0 then
    closeHandle(info.hprocess);
  if info.hThread<>0 then
    closeHandle(info.hThread);
  outMemo.Lines.LoadFromFile('out.txt');
  errMemo.Lines.LoadFromFile('err.txt');
end;