Newsgroup: it.comp.lang.c++
Titolo: Eseguire altre applicazioni

Salve a tutti,
uso MFC e vorrei che la mia applicazione permettesse di eseguire altri
programmi(*.exe).
Come si lancia un eseguibile?
Grazie
Emanuele

Con le API WinExec, e CreateProcess; la prima funziona anche sotto Win 3.x
mentre la seconda solo su Win95, ma ha un maggior numero di parametri da
passargli.
Un esempio di utilizzo di WinExec:
WinExec("C:\\PROVA.EXE", 0);
Se vuoi maggiori informazioni guarda sull'Help e' tutto ben spiegato.
Ciao, Antonio.
P.S.: ricordatevi di votare per it.comp.programmare.win32



Puoi utilizzare CreateProcess (utile se devi controllare quando il processo
che hai lanciato è terminato o se devi scambiare messaggi, cercare finestre
del processo "figlio" ecc...).
Puoi invece utilizzare ShellExecute o ShellExecuteEx (spero di essermi
ricordato i nomi giusti...) per eseguire un programma oppure aprire un file
"registrato" (quelli che windows ti permette di aprire con un doppio click).
P.S. Non utilizzo abitualmente MFC e quindi non sò se esistono funzioni
equivalenti, dovresti comunque essere in grado di richiamare queste funzioni
API senza troppi problemi.
---
Valter Minute
min...@fortech.it
 (the reply address of this message is invalid)
---
Are you looking for a good freeware ScreenSaver? Try FOYD!
http://hotfiles.zdnet.com/cgi-bin/texis/swlib/hotfiles/getit.bin?fcode=000PZ
0
if you want, I can send you the (free) C++ source code.

Come si lancia un eseguibile?
In vari modi, il piu` semplice e` probabilmente il modo standard:
    system("eseguibile.exe e suoi argomenti")
La system() e` una funzione prevista dallo standard del linguaggio
C++ (e anche dal C); per renderela disponibile devi avere usato
#include <stdlib.h>
fra gli include del tuo programma.
Purtroppo, system() da` pochissimo (nessun) controllo sulla
interazione con l'altro programma cosi` lanciato, quindi occorre
spesso usare meccanismi non altrettanto portatili e standard,
come _popen (in <stdio.h> con VC++; altri compilatori, violando
gli standard ISO, omettono l'underline iniziale) che almeno ti
permette di usare lo stdin O lo stdout del programma che stai
lanciando, oppure le varie apposite API di Win32, come
ShellExecute, ShellExecuteEx, CreateProcess, ecc.  A seconda
delle specifiche esigenze in oggetto, ti converra` ogni volta
usare l'approccio "meno non-portabile" sufficiente a riempirle;
in generale, da questo punto di vista, l'ordine di preferenza e`:
    system    // la migliore, se ti basta funzionalita` super-minimale!-)
    _popen    // se le esigenze sono appena piu` avanzate
    ShellExecute        // gira anche su Win32s
    ShellExecuteEx    // migliore, ma non supporta Win32s
    CreateProcess    // la + complicata e raffinata, per usi speciali
    CreateProcessAsUser    // qui andiamo sull'esoterico:-)
Ci sono anche famiglie di funzioni _spawn... e _exec..., che certe
volte possono far comodo, nonche` la possibilita` in certi casi che
l'"altra applicazione" parta in modo trasparente come effetto
collaterale di certe richieste del tuo programma (ad esempio,
quando connetti un oggetto COM, e quell'oggetto e` implementato
da un servente fuori-processo, cioe` da una .EXE).
Che io sappia, le MFC non aggiungono nessuna ulteriore
possibilita` a questa gia` amplissima gamma di funzionalita`
offerte dalle API, dalle librerie di runtime del C, e da vari
meccanismi di sistema, per "eseguire altre applicazioni".
Alex

del processo "figlio" ecc...).
Anche io ho utilizzato spesso CreateProcess in maniera + che soddisfacente
ma ho sempre ignorato la possibilità di capire quando il precesso lanciato
termina, come faccio ad implementare questo controllo?
Ciao
Terenzio

...

CreateProcess ti ritorna due handle:
- un handle relativo al processo lanciato
- un handle relativo al thread principale dello stesso
Puoi richiamare WaitForSingle[Multiple]Object[s] passandogli l'handle del
processo per attendere la fine dell'esecuzione (puoi anche fare solo un
"veloce controllo" impostando il timeout a 0).
Esiste anche la funzione GetExitCodeProcess che permette di controllare il
"return code" del processo che è stato lanciato (ovviamente dopo la sua
chiusura :-))
P.S.Non dimenticarti di utilizzare CloseHandle per rilasciare gli handle
ritornati da CreateProcess.
