Подавить консоль при вызове "system" в С++

Я использую команду system в С++ для вызова какой-либо внешней программы, и всякий раз, когда я ее использую, окно консоли открывается и закрывается после завершения команды.

Как я могу избежать открытия окна консоли? Я был бы рад, если бы решение могло быть независимым от платформы. Я также хотел бы, чтобы моя программа дождалась завершения команды.

Ответ 1

Похоже, вы используете окна.

В Linux (и * nix вообще) я заменил бы вызов на system на вызовы fork и exec соответственно. В Windows я думаю, что в Windows API есть какая-то функция spawn-a-new-process, обратитесь к документации.

Когда вы выполняете командные команды и/или внешние программы, ваша программа трудно сделать независимой от платформы, так как она будет зависеть от платформы, имеющей команды и/или внешние программы, которые вы используете.

Ответ 2

Это, вероятно, самый простой и, возможно, лучший способ, это также сделает так, чтобы ваша программа не зависала во время выполнения этой команды. Сначала не забудьте включить заголовок Windows, используя

#include <Windows.h>

Затем вам нужно использовать следующую функцию для выполнения вашей команды:

WinExec("your command", SW_HIDE); 

Примечание; Метод WinExec устарел более десятилетия. Тем не менее, он все еще работает хорошо. Вы не должны использовать этот метод, если это не требуется.

... вместо того, что вы не хотите использовать;

system("your command");

Ответ 4

Errm. CreateProcess или ShellExecute.

Ответ 5

Здесь можно выполнить команды без нового окна cmd.exe. На основе Ответ Roland Rabien и MSDN, я написал рабочий функция:

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

Работает на всех платформах Windows. Вызовите так же, как вы system().