Unterdrückt Konsole, wenn „System“ in C ++ Aufruf
-
05-07-2019 - |
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.
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()
.