2009-11-26 12 views
8

Sto usando il comando system in C++ per chiamare un programma esterno e ogni volta che lo uso, una finestra della console si apre e si chiude dopo il completamento del comando.Supremetta console quando si chiama "system" in C++

Come evitare l'apertura di una finestra della console? Sarei felice se la soluzione potesse essere indipendente dalla piattaforma. Mi piacerebbe anche che il mio programma attenda fino al termine del comando.

+0

duplicato con migliori risposte (per Windows): http://stackoverflow.com/questions/1597289/hide-console-in-c-system-function-win – Steed

risposta

3

Sembra che tu stia utilizzando Windows.

Su Linux (e * nix in generale), sostituivo la chiamata a system con chiamate a fork e exec, rispettivamente. Su Windows, penso che ci sia una specie di funzione di spawn-a-new-process nell'API di Windows — consultare la documentazione.

Quando si eseguono comandi shell e/o programmi esterni, il programma è difficile da rendere indipendente dalla piattaforma, poiché dipenderà dalla piattaforma con i comandi e/oi programmi esterni in esecuzione.

+0

In generale, hai ragione circa i programmi che sono dipendente dalla piattaforma quando si usano i comandi della shell. Tuttavia, in questo caso, mi sto assicurando che il programma esterno sia installato sulla macchina che sto utilizzando. Non è un semplice comando di shell. Per quanto riguarda la tua risposta - È possibile utilizzare CreateProcess per windows e fork + exec per unix, ma speravo di risolverlo in modo più elegante. – Dana

+0

cosa non è elegante in CreateProcess/fork + exec? Se lo avvolgi in una bella lezione, hai un modo molto elegante per avviare i processi, inoltre puoi facilmente aggiungere opzioni come reindirizzare l'output/input ect. – stijn

1

Errm. CreateProcess o ShellExecute.

5

Questo è probabilmente il modo più semplice e forse il migliore, inoltre farà in modo che il programma non si blocchi durante l'esecuzione di questo comando. Inizialmente non dimenticare di includere l'intestazione di Windows usando;

#include <Windows.h> 

Quindi è necessario utilizzare la seguente funzione per eseguire il comando;

WinExec("your command", SW_HIDE); 

Nota; Il metodo WinExec è stato deprecato per oltre un decennio. Oggi funziona comunque bene. Non si dovrebbe usare questo metodo se non richiesto.

... invece del modo in cui si desidera utilizzare ;

system("your command"); 
+2

Chiamerei a malapena WinExec il modo "migliore", dato che è stato ritirato per oltre 17 anni. –

+0

Ok, non ero sicuro su di esso quindi questo è il motivo per cui ho detto che forse –

+1

ha funzionato bene per me, anche se deprecata devo upvote da quando ero alla ricerca di ore. Grazie – Demurgos

0

Ecco un modo per eseguire comandi senza un nuovo cmd.exe finestra. Sulla base di Roland Rabien's answer e MSDN, ho scritto una funzione di lavoro:

int windows_system(const char *cmd) 
{ 
    PROCESS_INFORMATION p_info; 
    STARTUPINFO s_info; 
    LPSTR cmdline, programpath; 

    memset(&s_info, 0, sizeof(s_info)); 
    memset(&p_info, 0, sizeof(p_info)); 
    s_info.cb = sizeof(s_info); 

    cmdline  = _tcsdup(TEXT(cmd)); 
    programpath = _tcsdup(TEXT(cmd)); 

    if (CreateProcess(programpath, cmdline, NULL, NULL, 0, 0, NULL, NULL, &s_info, &p_info)) 
    { 
    WaitForSingleObject(p_info.hProcess, INFINITE); 
    CloseHandle(p_info.hProcess); 
    CloseHandle(p_info.hThread); 
    } 
} 

Funziona su tutte le piattaforme Windows. Chiama come se fosse system().

Problemi correlati