Pergunta

Eu estou usando o comando system em C ++ para chamar algum programa externo, e sempre que eu usá-lo, uma janela do console abre e fecha após o comando acabamentos.

Como posso evitar a abertura de uma janela do console? Eu ficaria feliz se a solução poderia ser independente de plataforma. Gostaria, também, para o meu programa de esperar até que o comando esteja concluído.

Foi útil?

Solução

Parece que você está usando o Windows.

No Linux (e * nix em geral), eu substituir a chamada para system com chamadas para fork e exec, respectivamente. No Windows, eu acho que há algum tipo de função-a-nova-processo de desova na API do Windows-consulte a documentação.

Quando você estiver executando comandos shell e / ou programas externos, o seu programa é difícil fazer independente de plataforma, uma vez que irá depender da plataforma ter os comandos e / ou programas externos você está executando.

Outras dicas

Este é provavelmente o mais fácil e talvez a melhor maneira, isso também vai fazer com que seu programa não congelar durante a execução deste comando. No início não se esqueça de incluir o cabeçalho do Windows usando;

#include <Windows.h>

Em seguida, você precisa usar a seguinte função para executar o seu comando;

WinExec("your command", SW_HIDE); 

Nota; O método WinExec foi preterido por mais de uma década. Ele ainda funciona, embora hoje bem. Você não deve usar este método se não for necessário.

... em vez da maneira como você não deseja usar;

system("your command");

exec () parece independente de plataforma bastante como é POSIX. No windows, é _exec () enquanto é exec () no UNIX: Veja http://msdn.microsoft.com/en-us/library/431x4c1w (VS.71) .aspx

ERRM. CreateProcess ou ShellExecute.

Aqui está uma maneira de executar comandos sem uma nova janela cmd.exe. Com base na resposta de Roland Rabien e MSDN , eu escrevi uma função de trabalho:

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 em todas as plataformas Windows. Chamar apenas como você system().

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top