Supprimer la console lors de l'appel de «système» en C ++
-
05-07-2019 - |
Question
J'utilise la commande system
en C ++ pour appeler un programme externe et, chaque fois que je l'utilise, une fenêtre de console s'ouvre et se ferme une fois la commande terminée.
Comment puis-je éviter l'ouverture d'une fenêtre de console? Je serais heureux si la solution pouvait être indépendante de la plate-forme. J'aimerais aussi que mon programme attende que la commande soit terminée.
La solution
On dirait que vous utilisez Windows.
Sous Linux (et * nix en général), je remplacerais l'appel de système
par des appels respectivement vers fork
et exec
. . Sous Windows, je pense qu’il existe une sorte de fonction de génération de processus dans l’API Windows & # 8212; consultez la documentation.
Lorsque vous exécutez des commandes shell et / ou des programmes externes, votre programme est difficile à rendre indépendant de la plate-forme, car cela dépendra de la plate-forme ayant les commandes et / ou les programmes externes que vous exécutez.
Autres conseils
C’est probablement le moyen le plus simple et peut-être le meilleur. Cela permettra également à votre programme de ne pas geler pendant l’exécution de cette commande. Au début, n'oubliez pas d'inclure l'en-tête Windows en utilisant;
#include <Windows.h>
Ensuite, vous devez utiliser la fonction suivante pour exécuter votre commande:
WinExec("your command", SW_HIDE);
Note; La méthode WinExec
est obsolète depuis plus de dix ans. Cela fonctionne toujours bien aujourd'hui cependant. Vous ne devriez pas utiliser cette méthode si elle n’est pas requise.
... au lieu de la façon dont vous refusez d'utiliser;
system("your command");
exec () semble assez indépendant de la plate-forme car il est POSIX. Sous Windows, c’est _exec () alors qu’il est exec () sous unix: voir http://msdn.microsoft.com/en-us/library/431x4c1w (VS.71) .aspx
Errm. CreateProcess
ou ShellExecute
.
Voici un moyen d'exécuter des commandes sans une nouvelle fenêtre cmd.exe
. D'après la réponse de Roland Rabien et MSDN , j'ai écrit une fonction qui fonctionne:
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);
}
}
Fonctionne sur toutes les plateformes Windows. Appelez comme vous le feriez system ()
.