Frage

Ich bin mit dem system Befehl in C ++ einige externe Programm aufzurufen, und wenn ich es verwenden, ein Konsolenfenster öffnet und schließt, nachdem der Befehl beendet.

Wie kann ich die Öffnung von einem Konsolenfenster vermeiden? Ich würde mich freuen, wenn die Lösung plattformunabhängig sein könnte. Ich mag auch für mein Programm warten, bis der Befehl beendet ist.

War es hilfreich?

Lösung

Es klingt wie Sie mit Windows arbeiten.

Unter Linux (und * nichts im Allgemeinen), würde ich den Anruf ersetzen Anrufe system fork und exec ist. Am Fenster, ich glaube, es irgendeine Art von Spawn-a-new-Prozess-Funktion in der API-consult Windows ist die Dokumentation.

Wenn Sie Shell-Befehle ausführen und / oder externe Programme, ist Ihr Programm hart plattformunabhängig zu machen, wie es auf der Plattform abhängt, die Befehle und / oder externe Programme, die Sie ausführen.

Andere Tipps

Dies ist wahrscheinlich die einfachste und vielleicht der beste Weg, dies wird es auch machen, so dass Ihr Programm nicht gefriert, während dieser Befehl ausgeführt wird. Zuerst vergessen Sie nicht die Windows-Header enthalten verwendet wird;

#include <Windows.h>

Dann müssen Sie die folgende Funktion verwenden, um Ihren Befehl auszuführen;

WinExec("your command", SW_HIDE); 

Hinweis; Die WinExec Verfahren ist seit mehr als einem Jahrzehnt als veraltet. Es funktioniert immer noch gut heute aber. Sie sollten diese Methode nicht verwenden, wenn nicht erforderlich.

... statt, wie Sie nicht verwenden möchten;

system("your command");

exec () sieht ganz plattformunabhängig, da es POSIX ist. Am Fenster, es ist _exec (), während es exec () auf Unix ist: Siehe http://msdn.microsoft.com/en-us/library/431x4c1w (VS.71) aspx

Errm. CreateProcess oder ShellExecute.

Hier ist eine Möglichkeit, Befehle auszuführen, ohne dass ein neues cmd.exe Fenster. Basierend auf Roland Rabien Antwort und MSDN , ich habe eine Arbeitsfunktion geschrieben:

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);
  }
}

Funktioniert auf allen Windows-Plattformen. Rufen Sie genau wie Sie würde system().

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top