Asynchrones Starten eines unabhaengigen Prozesses aus C++ Programm
-
Danke ! Auf die 2.Loesung haette ich selber kommen koennen, manchmal hat man Brett vor Kopf ...
Wie sieht es aber bei Windows aus ??
-
Hab ein bisschen gegoogelt, die 1. Loesung scheint die systemunabhaengige sein. Setsam ist, dass ich in meiner C++ Reference nicht die exec* -Befehle und das fork() - Befehl finde. Kann mir jemand eine Online-Quelle nennen, wo ich mich schlau machen kann ??
-
Nein, die ist nicht Systemunabhängig. man: fork(2) und man: execvp(3) sind Funktionen (_nicht_ Befehle) aus POSIX (_nicht_ ISO C++), die unter Windows glaube ich nicht zur Verfügung stehen (gibt POSIX-Layer, so wie Cygwin und Windows NT hatte zumindest auch etwas in die Richtung). Aber es ist nicht unbedingt portabel zwischen Windows und Linux.
Unter Windows gibt es irgend eine umständliche WinAPI-Funktion dafür.
-
Hmm, danke, aber das hilft mir nicht weiter. Gibt' denn dafuer keine portable Library, die die systemspezifischen Dinge kapselt ???
-
Ich kenne zumindest keine. Aber wenn es nur um die Kleinigkeit geht, kannst du ja mittels eines ifdefs eine Fallunterscheidung machen für Windows und Linux/Unix.
-
Als TCHAR version:
#include <windows.h> int run_application(LPCTSTR app, LPTSTR const argv[]) { // Variablen (->C) initalisierung fast immer überflüssig size_t len = 0; LPTSTR cl = NULL, end = NULL; LPTSTR* argv2 = argv; BOOL suc = FALSE; PROCESS_INFORMATION pi; STARTUPINFO si = {0}; // si füllen si.cb = sizeof(si); // ... // Länge des cl strings berechnen for(len = 0; *argv2 != NULL; argv2++) len += _tcslen(*argv2) + 2; // +2, da alle args in "" setzen // _tcslen wegen TCHAR aber _ -> vendor specific // Command line buffer erstellen LPTSTR cl = malloc(sizeof(TCHAR) * len); cl[0] = 0; // strcat // cl füllen for(argv2 = argv, end = cl; *argv2 != NULL; argv2++) { end += _stprintf(end, "\"%s\"", *argv2); // %s ist wie TCHAR %S immer umgekehrt _tcscat(cl, *argv2); } // Prozess erstellen suc = CreateProcess(app, cl, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); return suc ? 0 : -1; }
Also ich finde das mitnichten umständlicher
und besser als eine kopie des eigenen prozesses mit einem anderen zu ersetzen ist es allemal. :p
-
nachtrag:
free(cl);und in zeile 22 sizeof(TCHAR) * (len + 1)
-
nachtrag2: zeile 27 "\"%s\"" -> TEXT("\"%s\"")
-
nachtrag3: -zeile 28
-
Danke, der C-Stil ist ist fuer mich etwas ungewoht, ich werde Deine Loesuing ausprobieren und gebe dann Bescheid.