Newsgroup: it.comp.programmare
Titolo: C++ e funzione system

Salve,
come saprete in C++ per windows c'e' la funzione system che consente di 
eseguire applicazioni come se si lanciassero dalla prompt.
Ad es. se ho il programma hello.exe che stampa Hello World il seguente 
codice:
#include <iostream>
int main() {
    system ("hello.exe");
}
genera un programma che eseguendolo richiama hello.exe.
E' possibile fare il modo che aggiungengo un'altra chiamata 
system("hello.exe") si apra una nuova finestra in modo da avere due 
esecuzioni di hello.exe? Ho provato ma non va perché apre sempre nella 
stessa e non ne esegue piu di una.
Grazie 


Ti conviene utilizzare l'API CreateProcess o la CreateProcessEx se
lavori con Windows.
In questo modo hai anche (volendo) il controllo sull'effettiva
terminazione dei processi mediante i due handle (per processo) che ti
restituisce la funzione.
Occhio che se non ti interessano, devi chiudere manualmente gli handle
subito (altrimenti hai un memory leak).
Comunque è tutto spiegato su MSDN
LP

 lavori con Windows.
Uso Dev-C++ sai se supporta queste API?
Ciao 


Le API sono di Windows, ergo sono disponibili direttamente dalle DLL di
sistema.
Dalla pagina di MSDN
Requirements
Client:	Requires Windows Vista, Windows XP, Windows 2000 Professional,
Windows NT Workstation, Windows Me, Windows 98, or Windows 95.
Server: Requires Windows Server 2008, Windows Server 2003, Windows 2000
Server, or Windows NT Server.
(Per la serie, tutto tranne il DOS e sistemi non Microsoft)
Header: Declared in Winbase.h; include Windows.h.
Library: Use Kernel32.lib.
DLL: Requires Kernel32.dll.
Unicode: Implemented as CreateProcessW (Unicode) and CreateProcessA (ANSI).
Kernel32.lib e Kernel32.dll fanno già parte del progetto
(obbligatoriamente), l'include di Windows.h dovrebbe essere già presente
(al massimo lo metti in testa al file che richiama la CreateProcess).
Unico problema che può saltare fuori è se stai utilizzando le MFC,
poiché le MFC mal digeriscono quasi qualsiasi cosa non sia MFC (compresa
l'inclusione di windows.h), ma dall'esempio che hai messo, non mi sembra
il tuo caso.
Luca

 sistema.
Ok wndows.h c'č.
Mi potresti fare un esempio di chiamata a CreateProcess?
Ho visto la guida ma ci sono un sacco di parametri da passare e non saprei 
quali mettere.
Grazie 

 
Vado un po' a memoria (adesso sono sotto Linux e non posso provarla
direttamente, quindi è possibile che ci siano un paio di problemi)
void Launch(LPCTSTR commandline) {
  STARTUPINFO si;
  PROCESS_INFORMATION pi;
  //Pulizia delle strutture
  memset(&si,0,sizeof(si));
  si.cb=sizeof(si);
  memset(&pi,0,sizeof(pi));
  //Creiamo il processo
  if (CreateProcess(NULL,        //Application name
                    commandline, //command line
                    NULL,        //process attribute => same as calling
                    NULL,        //thread attribute => same as calling
                    FALSE,       //inherit handles => no
                    NULL,        //creation flags => default
                    NULL,        //environment => same as calling
                    NULL,        //working dir => same as calling
                    &si,         //Startup info
                    &pi          //Process info (out)
                   )==FALSE) {
    MessageBox(NULL,_T("Errore durante l'invocazione del comando"),
    return;
  }
  //Qui il processo è partito, rilasciamo gli handle che non servono
  //per evitare memory leaks (altrimenti possiamo fare una
  //WaitForSingleObject per verificare la chiusura del processo
  //prima di chiudere gli handle)
  CloseHandle(pi.hProcess);
  CloseHandle(pi.hThread);
}
Comunque, per ulteriori informazioni, ti conviene andare su
it.comp.programmare.win32, il ng dedicato alla programmazione relativa
all'ambiente win32.
Spero comunque di esserti stato d'aiuto.
Luca

    MessageBox(NULL,_T("Errore durante l'invocazione del comando"),
E qui mi dice che _T non è dichiarata.
Ciao 


ok, ragiono in UNICODE.
Hai 2 strade, o attivi la define UNICODE tra le opzioni del progetto,
oppure metti LPCSTR al posto di LPCTSTR e togli il _T() mettendo al
posto di _T("Errore durante l'invocazione del comando") semplicemente
"Errore durante l'invocazione del comando"
Puoi tranquillamente usare la seconda.
Luca

 "Errore durante l'invocazione del comando"
Ho messo MessageBox(NULL,"Errore durante l'invocazione del comando",
Ma l'errore c'e' lo stesso mi dice conversione non valida da const CHAR* a 
CHAR*
Ciai 

 stessa e non ne esegue piu di una.
Si'.
In ambiente Windows NT e successivi, se scrivi
	system("hello");
viene lanciato CMD.exe che interpreta il comando "hello". Quando tale 
comando è finito, anche CMD termina e quindi anche l'istruzione "system" 
termina.
Se invece scrivi
	system("start hello");
viene lanciato CMD.exe che interpreta il comando "start hello". Questo 
comando lancia una nuova istanza di CMD facendogli interpretare il 
comando "hello" e proseguendo. A questo punto la prima istanza di CMD 
termina e quindi anche l'istruzione "system" termina.
Pertanto, se scrivi
	system("start hello");
	system("hello");
Il comando "hello" viene lanciato due volte in rapida successione senza 
attendere che la primo comando termini. Il tuo programma prosegue quando 
il secondo comando termina, anche se il primo non e' ancora terminato.
Se invece scrivi:
	system("start hello");
	system("start hello");
Il comando "hello" viene lanciato due volte in rapida successione e il 
tuo programma prosegue senza attendere che tali comandi siano terminati.
P.S. Il corrispondente in ambiente POSIX e':
	system("hello &");
-- 
     Carlo Milanesi
 
http://digilander.libero.it/carlmila


Perché la funzione non è completa :-P (però anche tu non te ne sei
accorto, ahi ahi ahi)
Avevo scritto, infatti solo
MessageBox(NULL,_T("Errore durante l'invocazione del comando"),
invece di completare la funzione
Tolto il _T() dovrebbe essere
MessageBox(NULL,"Errore durante l'invocazione del comando",
           "Errore", MB_ICONERROR);
Così dovrebbe funzionare, altrimenti se vai da console, puoi anche
mettere una printf (in fondo la messagebox apre solo una finestrella di
messaggio per comunicare il problema).
Luca

 accorto, ahi ahi ahi)
Non conosco quella funzione quindi non sapevo se fosse completa o meno.
Cmq ora non da errore ma rimane il problema legato all'errore di conversione 
da const CHAR* a CHAR*
Per caso mi sai indicare qualche guida alle API di windows, magari in 
italiano (anche se mi sembra difficile)?
Ciao

 system("start hello");
Ecco! Il comando era start! E pensare che anni fa lo usavo e non me ne 
ricordavo!
Grazie. 

 
Luca

 void Launch(LPCSTR commandline)
Ok ora compila.
Per invocarlo uso Launch ("Hello.exe") ?
Ciao 

 Per invocarlo uso Launch ("Hello.exe") ?
Ok funziona, ma in pratica esegue instanze diverse sempre sulla stessa 
console?
Quale e' la differenza tra CreateProcess e CreateProcessEx?
Ciao 

 
PSK