Подавить консоль при вызове «системы» в C++
-
05-07-2019 - |
Вопрос
я использую 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 ()
.