Newsgroup: it.comp.lang.delphi
Titolo: Aiuto

    Ciao ragazzi! Ho questo picollo problema: da un programma delphi lancio
un comando che mi apre MS-DOS Prompt  ( non è un comando DOS , può essere un
eseguibile con dei parametri che io li construisco dal programma in modo
dinamico).
    Ok, questo programma esterno si lancia in una finestra DOS, e tutto va
bene! Ma io, devo aspettare dal programma delphi, che quell'eseguibile
esterno finisce! E invece, il mio programma Delphi non aspetta! Come si fa
ad aspettare che quell eseguibile finisce e solo allora il mio programma va
avanti?
        Per lanciare il programma esterno ho utilizzato WINEXEC!
        Grazie e scusatemi per il mio italiano se ho scritto male!
        George.


Ti invio il codice di un post di qualche giorno fa (che adesso non trovo):
utilizza la CreateProcess e attende che il programma abbia finito.
{ Avvia un programma ed aspetta la sua chiusura prima di procedere.
I parametri:
cProgram: contiene nome.estensione del programma da eseguire
          (come accennato può essere un bat ma anche un exe o un com).
          E' possibile per altro scrivere una cosa del tipo
          WinExecAndWait( 'miobat.bat par1 par2 par3', 0 )
          dove par1, par2, par3 sono i parametri che saranno elaborati dal
batch
          la funzione assume che il programma da eseguire si trovi nella
stessa
          directory dell'applicazione delphi infatti la prima riga della
          function cita
          cWorkDir := ExtractFilePath( Application.EXEName )
          ma nulla vieta di cambiare il tutto.
nVisibility:  è il modo di visualizzazione della finestra dos che viene
creata
              ma ho avuto alcuni problemi nella gestione del parametro e per
              il momento la funzione all'interno usa SW_SHOWDEFAULT fisso
              avrei potuto eliminare il parametro ma...
Il valore di ritorno è 0 se tutto è andato a buon fine qualsiasi altro
Intero se si è verioficato un errore}
function WinExecAndWait(cProgram: string; nVisibility: integer): integer;
var
  cWorkDir: string;
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
begin
  cWorkDir:='';
  FillChar( StartupInfo, Sizeof( StartupInfo), #0);
  FillChar( ProcessInfo, Sizeof( ProcessInfo), #0);
  StartupInfo.lpReserved     := nil;
  StartupInfo.lpDesktop      := nil;
  StartupInfo.lpTitle        := PChar('DOS process');
  StartupInfo.dwX            := 1;
  StartupInfo.dwY            := 1;
  StartupInfo.dwXSize        := 600;
  StartupInfo.dwYSize        := 400;
  StartupInfo.dwXCountChars  := 80;
  StartupInfo.dwYCountChars  := 25;
  StartupInfo.dwFillAttribute:= 0;
  StartupInfo.cbReserved2    := 0;
  StartupInfo.lpReserved2    := nil;
  StartupInfo.hStdInput      := 0;
  StartupInfo.hStdOutput     := 0;
  StartupInfo.hStdError      := 0;
  StartupInfo.cb             := Sizeof( StartupInfo);    // Ampiezza in Byte
della struttura
  StartupInfo.wShowWindow    := SW_SHOWDEFAULT;          // nVisibility;
  StartupInfo.dwFlags        := STARTF_FORCEONFEEDBACK;
  if not CreateProcess(nil,
                       PChar(cWorkDir+cProgram),
                       nil,
                       nil,
                       false,
                       CREATE_NEW_CONSOLE or CREATE_DEFAULT_ERROR_MODE,
                       getEnvironmentStrings,
                       nil,
                       StartupInfo,
                       ProcessInfo) then
    Result:=-1
  else
    begin
      WaitForSingleObject(ProcessInfo.hProcess,INFINITE);
      GetExitCodeProcess(ProcessInfo.hProcess,Result);
    end;
end;
Ciao
Solid Snake




    Ti ringrazio! Comunque anche io ho fatto cosi! Ma non mi sembra la
migliore scelta!
             Grazie di nuovo, Rat!
                    George.
Rat wrote in message ...



