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.

¿Fue útil?

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 () .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top