Domanda

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 al termine del comando.

Come posso evitare l'apertura di una finestra della console? Sarei felice se la soluzione potesse essere indipendente dalla piattaforma. Vorrei anche che il mio programma attendesse il completamento del comando.

È stato utile?

Soluzione

Sembra che tu stia usando Windows.

Su Linux (e * nix in generale), sostituirei la chiamata a system con le chiamate a fork e exec , rispettivamente . Su Windows, penso che ci sia una sorta di funzione spawn-a-new-process nell'API di Windows & # 8212; consultare la documentazione.

Quando esegui comandi shell e / o programmi esterni, il tuo programma è difficile da rendere indipendente dalla piattaforma, poiché dipenderà dalla piattaforma che ha i comandi e / o programmi esterni che stai eseguendo.

Altri suggerimenti

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

#include <Windows.h>

Quindi devi usare la seguente funzione per eseguire il tuo comando;

WinExec("your command", SW_HIDE); 

Nota; Il metodo WinExec è stato deprecato per oltre un decennio. Oggi funziona ancora bene. Non utilizzare questo metodo se non richiesto.

... invece del modo in cui non vuoi usare;

system("your command");

exec () sembra abbastanza indipendente dalla piattaforma in quanto è POSIX. Su Windows, è _exec () mentre è exec () su Unix: vedi http://msdn.microsoft.com/en-us/library/431x4c1w (VS.71) aspx

ERRm. CreateProcess o ShellExecute .

Ecco un modo per eseguire comandi senza una nuova finestra cmd.exe . Basato su la risposta di Roland Rabien e MSDN , ho scritto una funzione funzionante:

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 proprio come faresti con system () .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top