c++ Neuen Prozess in neuer Konsole öffnen



  • Hallo zusammen 🙂 Ich habe folgendes Problem.
    Ich möchte in meiner Main ein Programm starten, welches einfach nebenherläuft,
    also z.b. möchte ich Firefox.exe starten während ich in meiner Konsole bin, und während firefox läuft, in meinem Code weitermachen (Konsolenanwendung).

    Mein Problem ist aber, dass mein Code nicht weiterläuft solange Firefox.exe noch läuft. Habe allerlei Sachen bisher ausprobiert, inkl System(...) und CreateProzess von Windowos, kann mir da jemand helfen ?

    hier meine Versuche :

    string evalstring = "cmd /c call ";
             evalstring.append(it->c_str());
             system(it->c_str());
    

    Also in einer Konsole "cmd /c call C:\\firefox.exe "z.b.
    Problem hierbei, es wird auf terminierung gewartet.
    Aber auch nicht immer, jeder 10te Versuch läuft durch 😕

    Versuch 2 :

    STARTUPINFO si;
    	PROCESS_INFORMATION pi;
    
    	ZeroMemory(&si, sizeof(si));
    	si.cb = sizeof(si);
    	ZeroMemory(&pi, sizeof(pi));
    
    	wchar_t wtext[256];
    	mbstowcs(wtext, filepathexecutecommand.c_str(),          strlen(filepathexecutecommand.c_str()) + 1);//Plus null
    	LPWSTR ptr = wtext;
    
    	// Start the child process. 
    	CreateProcess(NULL,   // No module name (use command line)
    		ptr,        // Command line
    		NULL,           // Process handle not inheritable
    		NULL,           // Thread handle not inheritable
    		FALSE,          // Set handle inheritance to FALSE
    		CREATE_NEW_CONSOLE,              // No creation flags
    		NULL,           // Use parent's environment block
    		NULL,           // Use parent's starting directory 
    		&si,            // Pointer to STARTUPINFO structure
    		&pi);           // Pointer to PROCESS_INFORMATION structure;
    
    	CloseHandle(pi.hProcess);
    	CloseHandle(pi.hThread);
    

    Selbes Problem wie oben 😞 Kann mir jemand weiter helfen ?
    Der Versuch eine Batch datei zu erstellen und diese dann zu starten, damit diese den gewünschten Prozess starten klappt leider auch nicht.



  • Probier mal
    cmd /c start "Window Title" Firefox.exe

    Der "Window Title" Parameter wird zwar für GUI Anwendungen nicht verwendet, angeben muss man ihn aber trotzdem.

    Ansonsten probier bei CreateProcess mal CREATE_BREAKAWAY_FROM_JOB | DETACHED_PROCESS als Flags statt CREATE_NEW_CONSOLE zu übergeben.



  • Folgefrage :
    folgendes Szenario :

    Ich habe nun meine a.exe auf dem Desktop und starte damit b.exe welches sich im Ordner Dokumente befindet.
    a läuft und b läuft. Nun erstellt b aber Dateien und legt sie, statt um b herum bei a ab. Was kann ich dagegen tuen ?

    An den quellcode von b.exe komme ich nicht, und

    for(int i=0;i<8;i++)
       system("cd .."); 
    
    string command = "cd ";
    command.append(changepathto);
    
    string evalstring = "cmd /c start ";
    evalstring.append("\"Window title\" ");
    evalstring.append(filepath);
    
    system(evalstring.c_str());
    

    klappt leider auch nicht 😞
    Ich wollte ihm vorgaukeln ich wäre in dem Pfad aber da macht der nicht mit.



  • CreateProcess() hat einen Parameter fürs Working Directory.



  • system("cd .."); bringt nix, da es nur das Working Directory des Child-Prozesses ändert der "cd" Ausführt.
    Nimm SetCurrentDirectory .



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (alle ISO-Standards) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


  • Mod

    Bitte schalte Code Tags auch an in Deinem Profil, wenn Du sie auch verwendest. Das hilft schon etwas 😉



  • Hm, ich hätte hier vermutlich ShellExecute() verwendet. Hat es einen Grund, warum das bisher nicht genannt wurde? Startet Prozesse, ohne auf die Terminierung zu warten und man kann das Arbeitsverzeichnis mit übergeben.



  • ShellExecute führt "Shell Verben" aus.
    D.h. welcher Prozess mit welchen Parametern dann wirklich gestartet wird, ist abhängig davon wie das System konfiguriert ist.

    Wenn man also eine ganz bestimmte .exe starten möchte, dann ist ShellExecute nicht die passende Funktion dafür. Wenn man dagegen das machen möchte was passiert wenn man ein bestimmtes File im Explorer doppeltklickt, dann ShellExecute genau die richtige funktion.



  • Ok, danke für die Aufklärung.

    /OT Zu meiner Entschuldigung: Offensichtlich haben die gut acht Jahre, in denen ich nichts mehr programmiert habe, ihre Spuren hinterlassen. Vielleicht sollte ich mich wieder mehr mit diesem Bereich beschäftigen, bevor der Rest auch noch weg ist...



  • Million Voices schrieb:

    Ok, danke für die Aufklärung.

    /OT Zu meiner Entschuldigung:

    Bitte. Und keine Entschuldigung nötig.
    ShellExecute wird sehr oft verwendet, und daher auch oft empfohlen - mMn. auch oft wo es halt nicht angebracht ist.

    Wobei es beim Starten von .exen mit ShellExecute zugegebenermassen mehr-oder-weniger egal ist. Man kann zwar sein Windows so konfigurieren dass bei nem Doppelklick auf ne .exe nicht die .exe gestartet wird sondern irgend ein anderes Programm. Es gibt dann aber sehr viele Dinge die nicht mehr funktionieren - ein Programm mehr oder weniger macht dann schon kaum mehr nen Unterschied.
    Sogesehen könnte es schon "akzeptabel" sein .exen mit ShellExecute zu starten.

    Andrerseits kann man es natürlich genau so gut gleich richtig machen und CreateProcess verwenden 🙂


Anmelden zum Antworten