Newsgroup: it.comp.lang.delphi
Titolo: Lanciare un EXE da programma

qualcuno saprebbe dirmi come posso lanciare un .exe da programma
devo usare la shellAPI oppure posso fare diversamente...
Grazie
Mauro

 devo usare la shellAPI oppure posso fare diversamente...
E' una delle soluzioni + rapide ed indolori...
Puoi usare anche la CreateProcess.... ma la shellexecute è molto + facile da
usare.
Ciao! Davide DG

 devo usare la shellAPI oppure posso fare diversamente...
Questo è il codice per lanciare un programma con la CreateProcess (arriva da
un post di molto tempo fa) e funziona benissimo:
{ 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} Non è vero si usa :
STARTF_USESHOWWINDOW
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    := STARTF_USESHOWWINDOW   file://correzione
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

 wrote in message
8kc238$eou$1...@news.IT.net...


>     Perche non winexec  ???
Perchè, a meno che Mauro non stia lavorando sotto Windows 3.1x (16 bit) (ma
non credo, visto che
parla di ShellExecute), è caldamente consigliato di utilizzare la
CreateProcess (al limite la SE)
per i nuovi programmi a 32bit.
Ciao!  Davide DG

    Perche non winexec  ???
WinExec non sara' supportata in versioni future di Windows.
Viene fornita per motivi di compatibilita' all'indietro ed implementa,
al suo interno, una chiamata a CreateProcess.
Meglio usare quest'ultima.
--
Andrea Laforgia (
andrea_...@bigfoot.com
)
---------------------------------------------
#exclude <windows.h>

devo usare la shellAPI oppure posso fare diversamente...
Puoi utilizzare CreateProcess(), ShellExecute() o la sua versione
estesa ShellExecuteEx().
Devi usare la ShellApi.


> qualcuno saprebbe dirmi come posso lanciare un .exe da programma....
usa Shellexecute della unit Shellapi.
ciao ciao
--
Gna...@Wappi.com
ICQ# 76488613
http://gnaffy.tripod.com/


Ho provato ad usare la ShellExecute() e funziona abbasanza bene su Win32s
ringrazio tutti
Mauro Pace

Posso chiederti se c'è un metodo per attendere la chiusura dell'applicazione
lanciata con shellexecute per continuare l'esecuzione del codice?

lanciata con shellexecute per continuare l'esecuzione del codice?
WaitForSingleObject()


 lanciata con shellexecute per continuare l'esecuzione del codice?
guarda la funzione di solid snake in questo stesso thread
Ciao
Alan Solo

guarda la funzione di solid snake in questo stesso thread
Credo che a quella funzione manchi il rilascio degli handle.
Cioe' due CloseHandle per l'oggetto kernel di processo e di thread
principale del processo.