Подавить консоль при вызове «system» в C ++ - PullRequest
10 голосов
/ 26 ноября 2009

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

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

Ответы [ 5 ]

5 голосов
/ 13 марта 2012

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

#include <Windows.h>

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

WinExec("your command", SW_HIDE); 

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

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

system("your command");
3 голосов
/ 26 ноября 2009

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

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

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

1 голос
/ 11 марта 2017

Вот способ выполнить команды без нового окна cmd.exe. Исходя из ответов Ролана Рабиана и 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().

1 голос
/ 26 ноября 2009

Errm. CreateProcess или ShellExecute.

1 голос
/ 26 ноября 2009

exec () выглядит довольно независимым от платформы, поскольку это POSIX. В Windows это _exec (), а exec () в Unix: см. http://msdn.microsoft.com/en-us/library/431x4c1w(VS.71).aspx

...