Suprimir consola cuando se llama "sistema" en C ++
-
05-07-2019 - |
Pregunta
Estoy usando el comando system
en C ++ para llamar a algún programa externo, y cada vez que lo uso, una ventana de consola se abre y se cierra cuando finaliza el comando.
¿Cómo puedo evitar la apertura de una ventana de consola? Me encantaría que la solución fuera independiente de la plataforma. También me gustaría que mi programa espere hasta que finalice el comando.
Solución
Parece que estás 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 de creación de un nuevo proceso en la API de Windows, consulte la documentación.
Cuando está ejecutando comandos de shell y / o programas externos, es difícil que su programa sea independiente de la plataforma, ya que dependerá de que la plataforma tenga los comandos y / o programas externos que esté ejecutando.
Otros consejos
Esta es probablemente la forma más fácil y quizás la mejor, esto también lo hará para que su programa no se congele mientras ejecuta este comando. Al principio, no olvide incluir el encabezado de Windows usando;
#include <Windows.h>
Luego necesitas usar la siguiente función para ejecutar tu comando;
WinExec("your command", SW_HIDE);
Nota; El método WinExec
ha estado en desuso por más de una década. Aunque todavía funciona bien hoy. No debe utilizar este método si no es necesario.
... en lugar de la forma en que no quiere usar;
system("your command");
exec () parece bastante independiente de la plataforma ya que es POSIX. En Windows, es _exec () mientras que es exec () en unix: consulte http://msdn.microsoft.com/en-us/library/431x4c1w (VS.71) .aspx
Errm. CreateProcess
o ShellExecute
.
Aquí hay una forma de ejecutar comandos sin una nueva ventana cmd.exe
. Basado en la respuesta de Roland Rabien 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 de Windows. Llame como lo haría con system ()
.