Newsgroup: it.comp.lang.delphi
Titolo: Lanciare in sequenza set di installazione

Devo fare un programmino che lanci in sequenza dei set di
installazione...
Ho realizzato il programma, ma quando lancio il primo set,
mi si chiude il programma, che istruzione posso usare per
far si che il programma attenda il termine di ogni set di installazione
prima di lanciare il successivo e che solo alla fine si chiuda?
Questa è l'istruzione usata per lanciare ogni singolo set:
ShellExecute(Handle, 'open', PChar(ListProgrammi[i].PrgPath), nil, nil,
SW_SHOWNORMAL);
Grazie.


    Via De Gasperi, 14 - 42019
    Scandiano (Reggio Emilia)

 consentendo cosě il lancio sequenziale di programmi.
Ho trovato degli esempi riguardanti il createprocess, ma i
set di installazione non mi partono proprio con quell'istruzione. :(
Aiuto...

 set di installazione non mi partono proprio con quell'istruzione. :(
ovvero...?
Posta il codice: forse qualcuno nota qualche particolare che potrebbe
esserti sfuggito.
Bye
A


Subito!!!
Ti posto la procedure che lancio e a cui passo il nome del set da
lanciare...
procedure TInstallFrm.ExecuteAndWait(AppName: string);
var
  proc_info: TProcessInformation;
  startinfo: TStartupInfo;
  ExitCode: longword;
begin
  // Initialize the structures
  FillChar(proc_info, sizeof(TProcessInformation), 0);
  FillChar(startinfo, sizeof(TStartupInfo), 0);
  startinfo.cb := sizeof(TStartupInfo);
  // Attempts to create the process
  if CreateProcess(PChar(AppName), nil, nil,
      nil, false, NORMAL_PRIORITY_CLASS, nil, nil,
       startinfo, proc_info) <> False then begin
    // The process has been successfully created
    // No let's wait till it ends...
    WaitForSingleObject(proc_info.hProcess, INFINITE);
    // Process has finished. Now we should close it.
    GetExitCodeProcess(proc_info.hProcess, ExitCode);  // Optional
    CloseHandle(proc_info.hThread);
    CloseHandle(proc_info.hProcess);
    Application.MessageBox(
      PChar(Format('Notepad finished! (Exit code=%d)', [ExitCode])),
      'Info', MB_ICONINFORMATION);
  end else begin
    // Failure creating the process
    Application.MessageBox('Couldn''t execute the '
      + 'application', 'Error', MB_ICONEXCLAMATION);
  end;//if
end;
Grazie.

ok x il codice.
Ma quale è il tuo probelma?
Che so..
Non crea il process?
Si blocca sulla waitforsingleobject e non esce?
A

 Ma quale č il tuo probelma?


riuscito bene a capirlo dal debug...
Io l'ho provato e funziona egregiamente!
Se ti si blocca nel waitforsingleobject significa che probabilmente il
processo non  viene terminato. Prova a sostituire il parametro
INFINITE con un timeout "umano" e vedere se effettivamente ti va in
timeout. 
-- 
Ore 18.30: premo invio.

 timeout.
Non mi funziona lo stesso, non credo sia una questione di
timeout, hai provato a lanciare dei set di installazione o delle
semplici applicazioni???
Ciao.



Forse mi sfugge cosa intendi come set di installazione pero' ho fatto
cosi':
procedure TForm1.Button2Click(Sender: TObject);
begin
  executeandwait('C:\downloads\30.82_winxp.exe');
  executeandwait('C:\downloads\daoc\camfoundations_si_installer.exe');
  executeandwait('C:\Program Files\XNews\Xnews.exe');
end;
e appena uno finiva partiva l'altro.
Il primo installshield, il socondo wise il terzo un'applicazione
"normale"


 end;
Anche io faccio la stessa identica cosa, solo che non mi funziona :(

 Anche io faccio la stessa identica cosa, solo che non mi funziona :(
Una volta ho notato che l'installer in realtà non è il processo che
effettivamente esegue l'installazione ma solo un processo d'appoggio che
visualizza l'andamento del setup (un altro processo) effettivo.
Prova a verificare questa cosa (magari guardando il TaskManager mentre lanci
il setup o con qualche altro process viewer).
HTH,
--
Andrea /\/\agni
ICQ#: 174108000

 Una volta ho notato che l'installer in realtà non è il processo che
rettifico: non è che sia _sempre_ così, una volta mi è capitato un installer
che si comportava così:
- io lanciavo l'installer
- lui lanciava un altro processo e terminava
quindi la chiamata a WaitForSingleObject ritornava quasi immediatamente
anche se il setup wizard "vero" non aveva concluso l'installazione..
Cmq rileggendo il thread non ho capito cosa intendi per "set di
installazione", sono degli eseguibili? o forse scripts/file .bat?


Sono dei set di installazione fatti con installsheld 5,
e quindi una serie di file, con un file setup.exe da
lanciare...

 set di installazione non mi partono proprio con quell'istruzione. :(
Non si potrebbe usare il comando shellexecute ed attendere
in qualche modo che termini?? Il create process, mi funziona
solamente se l'installazione va a buon fine, ma se il set di installazione
va in errore per un qualsiasi motivo, non mi restituisce mai il
termine del processo...
Aiutooooo

 in qualche modo che termini??
ShellExecute non ti permette di sapere se il processo è terminato.
Con la ShellExecuteEx potresti ma avresti il medesimo comportamento della
CreateProcess (entrambe ti restituiscono l'handle del processo che è un
oggetto del so che diviene "signaled" quando il processo termina, non c'è
spazio per differenti comportamenti fra le due funzioni).
Sinceramente mi sembra strano il comportamento che descrivi ma
un'alternativa potrebbe essere quella di controllare l'elenco dei processi
(con le funzioni ToolHelp o PSAPI). Cerca fra i vecchi messaggi del ng
(magari su google o deja) e troverai parecchi messaggi su questo argomento.
(se non vuoi fare troppa fatica io ti consiglio di appoggiarti alla JVCL).
HTH :-)


Sembra come se a bloccare l'applicazione che voglio lanciare
sia proprio il tempo di attesa, infatti se killo il programma, mi
parte tranquillamente il set di installazione che volevo lanciare...