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

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

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

5 ответов


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

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

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


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

#include <Windows.h>

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

WinExec("your command", SW_HIDE); 

Обратите Внимание:WinExec метод был устаревшим более десяти лет. Он все еще работает сегодня. Вы не должны использовать этот метод, если не требуемый.

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

system("your command");

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


Errm. CreateProcess или ShellExecute.


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