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.

Était-ce utile?

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 () .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top