Ein Programm aus c++ heraus ohne kurzes cmdfenster ausführen.
-
Ich würde gerne ein im Hintergrund datensammelndes Programm kleine vbs scripte ausführen lassen. Dafür nimmt man ja normalerweise system("start PATHTOPROGRAM"). Dort ploppt jedoch immer kurzzeitig ein kleines cmd Fenster auf, kann man das irgendwie beheben? Diese dinger nerven ziemlich, vor allem wenn ich dann yt gucke.
-
das hat nichts damit zu tun wie das aufgerufen wird.
Wenn das zu startende Programm ein "consolen" programm ist, dann wird immer so ein fenster aufpoppen.AFAIK kann man eventuell verhindern dass das finster im vordergrund aufpoppt z.b. stattdessen minimiert.
Aber wie das geht weis ich nicht
-
Du brauchst ein Programm nicht mit "start" starten. Führe das gewünschte Programm direkt aus, z.B. mit https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createprocessa
-
Vorweg: soweit ich weiss ist das eine Windows-Eigenheit und passiert auf anderen Systemen nicht.
Und natürlich lässt sich das beheben. Man muss "nur" dem Prozess beim Starten umgeleitete Standard-In, Standard-Out und Standard-Error Handles mitgeben.
Das geht z.B. wenn manCreateProcess
verwendet um den Prozess zu starten. Dort kann man in derSTARTUPINFO
Struktur die 3 Handles angeben (undSTARTF_USESTDHANDLES
indwFlags
setzen nicht vergessen). Die einfachste Variante wäre vermutlich für die beiden Output-Handles ein File aufzumachen. Und für Standard-In kann man vermutlich das pseudo-FileNUL
verwenden.Ansonsten gibt es da drinnen noch
wShowWindow
(->STARTF_USESHOWWINDOW
). Da könnte man es mitWS_HIDE
versuchen. Bin mir aber sicher ob das bei Konsolenprogrammen funktioniert. Und selbst wenn würde ich es nicht verwenden wollen. Standard-Handles umleiten sollte zuverlässig funktionieren und hat auch so mehrere Vorteile.
-
@firefly ich habs undeutlich gesagt system() lässt immer ein cmd fenster kurzzeitig aufploppen, da wollte ich ne alternative
-
@thinki sagte in Ein Programm aus c++ heraus ohne kurzes cmdfenster ausführen.:
@firefly ich habs undeutlich gesagt system() lässt immer ein cmd fenster kurzzeitig aufploppen, da wollte ich ne alternative
system
ruft cmd.exe (bzw. was in COMSPEC steht) auf und führt darüber dann etwas aus. Du solltest das Programm besser direkt ausführen und nicht über cmd.exe gehen. Siehe https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/system-wsystem?view=msvc-160 - versuche daher, statt system eine andere Funktion zu nutzen wie das schon erwähnte CreateProcess. Und auchstart
brauchst du nicht. Von daher würde ich dem "normalerweise macht man system(start programm)" gleich doppelt widersprechen.
-
@hustbaer könntest du mir bitte ein Beispiel mit der variable "Programmpfad" für den Programmpfad schreiben? Ich verstehe dieses create Process nicht bin noch sehr neu in der C++ Umgebung hab erst vor ein paar Tagen angefangen.
-
In Hide console in C system() function, Win gibt es 2 Beispiele mit
CreateProcess
.Edit: Evtl. wäre hier ShellExecute sogar nötig (denn VBS-Skripte sind ja keine eigenständigen Programme) - ist auch einfacher zu benutzen, als
CreateProcess
.