2009-11-26 24 views
8

Estoy usando el comando system en C++ para llamar a un programa externo, y cada vez que lo uso, una ventana de la consola se abre y se cierra después de que el comando finaliza.Suprimir la consola al llamar "sistema" en C++

¿Cómo puedo evitar la apertura de una ventana de la consola? Me alegraría si la solución pudiera ser independiente de la plataforma. También me gustaría que mi programa espere hasta que el comando finalice.

+0

duplicado con mejores respuestas (para Windows): http://stackoverflow.com/questions/1597289/hide-console-in-c-system-function-win – Steed

Respuesta

3

Parece que está usando Windows.

En Linux (y * nix en general), reemplazaría la llamada a system con llamadas a fork y exec, respectivamente. En Windows, creo que hay algún tipo de función spawn-a-new-process en la API de Windows — consulte la documentación.

Cuando ejecuta comandos de shell y/o programas externos, su programa es difícil de hacer independiente de la plataforma, ya que dependerá de la plataforma que tenga los comandos y/o programas externos que esté ejecutando.

+0

En general, tiene razón acerca de los programas que dependen de la plataforma al usar comandos de shell. Sin embargo, en este caso, me estoy asegurando de que el programa externo esté instalado en la máquina que estoy usando. No es un simple comando de shell. En cuanto a su respuesta: es posible utilizar CreateProcess para Windows y fork + exec para Unix, pero esperaba resolverlo de forma más elegante. – Dana

+0

¿Qué no es elegante sobre CreateProcess/fork + exec? Si lo envuelve en una clase agradable, tiene una forma muy elegante de iniciar procesos, además de que puede agregar fácilmente opciones como redirigir salida/entrada ect. – stijn

1

Errm. CreateProcess o ShellExecute.

5

Esta es probablemente la forma más fácil y quizás la mejor, esto también hará que su programa no se congele mientras ejecuta este comando. Al principio no se olvide de incluir el encabezado de Windows usando;

#include <Windows.h> 

Luego debe usar la siguiente función para ejecutar su comando;

WinExec("your command", SW_HIDE); 

Nota; El método WinExec ha quedado obsoleto durante más de una década. Sin embargo, todavía funciona bien hoy. No deberías usar este método si no es requerido.

... en lugar de la manera en que no desea usar;

system("your command"); 
+2

Casi no llamaría a WinExec la "mejor" manera, dado que ha estado obsoleto durante más de 17 años. –

+0

Ok, no estaba seguro, así que es por eso que dije que tal vez –

+1

funcionó bien para mí, incluso si desaprobaba tengo que volver a votar ya que estaba buscando por horas. Gracias – Demurgos

0

Aquí está una manera de ejecutar comandos sin una nueva ventana cmd.exe. Sobre la base de Roland Rabien's answer y MSDN, he escrito una función de trabajo:

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); 
    } 
} 

Funciona en todas las plataformas Windows. Llame al igual que lo haría system().

Cuestiones relacionadas