Вопрос

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

#include <Windows.h>

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

WinExec("your command", SW_HIDE); 

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

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

system("your command");

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

Эээ. CreateProcess или ShellExecute.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top