Probleme mit CreateProcess
-
Hallo zusammen,
ich habe eine Frage zu CreateProcess.
Und zwar versuche ich einen neuen Prozess zu starten, welcher eine bestehende Setup.exe ausführen soll. Dies geschieht folgendermaßen:STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory( &si, sizeof(si) ); si.cb = sizeof(si); ZeroMemory( &pi, sizeof(pi) ); //si.dwFlags = STARTF_USESHOWWINDOW; // Angeben, dass .wShowWindow benutzt wird //si.wShowWindow = SW_SHOWNORMAL; // Fensterstil setzen //si.lpDesktop = "WinSta0\\Default"; // Start the child process. int ret = CreateProcess( NULL, // No module name (use command line) m_path.GetBuffer(m_path.GetLength()), // Command line //"cmd.exe", NULL, // Process handle not inheritable NULL, // Thread handle not inheritable FALSE, // Set handle inheritance to FALSE 0, // No creation flags NULL, // Use parent's environment block (CString)m_path.GetAt(0) + ":\\", // Use Child starting directory &si, // Pointer to STARTUPINFO structure &pi ); // Pointer to PROCESS_INFORMATION structure // Wait until child process exits. WaitForSingleObject( pi.hProcess, INFINITE ); // Close process and thread handles. CloseHandle( pi.hProcess ); CloseHandle( pi.hThread );
komischerweise wird der Prozess zwar gestartet allerdings erscheint die GUI nicht.
Erkenntnisse:
- Wenn ich "cmd.exe" angebe funktioniert es wie es soll.
- Witzigerweise wird die Setup sichtbar gestartet wenn ich einen Breakpoint bei WaitforSingleObject setze.
-CreateProcess liefert auch eine 1 zurück.
-ShellExecuteEx liefert das gleiche Verhalten.
- Die auskommentierten Parameter und Flags helfen leider auch nicht weiter.
-Es ist egal ob ich den Pfad der Setup als ersten oder zweiten Parameter angebe. Es passiert das gleiche.Die MSDN und Forenbeiträge helfen mir auch nicht mehr weiter. Ich hoffe jemand kann mir da weiterhelfen.
Mfg
Tobi
-
ich habe ein ähnliches phänomen im zusammenhang mit dem aufruf eines links (LNK) und habe nach erfolgsloser suche den befehl um den aufruf bzw. als präfix
[cmd.exe /c ] erweitert. das funktioniert, dennoch bleibt die frage offen warum ist es soigor
-
Hallo Igor,
ja stimmt, das funktioniert. Allerdings bleibt dann eine Konsole ebenfalls geöffnet. Diese könnte man auch unsichtbar schalten, jedoch ist das ja nicht Ziel der Aufgabe.
Irgendwie hat das was mit Konsolenapp und GUI App zu tun. Konsolenapps funktionieren auf diese weise. GUI Apps haben irgendwie nicht das Recht den Desktop anzusprechen. Irgend sowas habe ich schon gelesen allerdings verstehe ich es nicht ganz, zumal meine Setup ausgeführt wird wenn ich das Hauptprogramm im Debugger abschieße.
Leider finde ich dazu noch keine zufriedenstellende Lösung.
Ich werde aber wieder schreiben wenn ich mehr weis.Mfg
Tobi
-
Witzig ist auch, dass es funktioniert wenn ich aus dem Hauptprogramm zuerst einen Thread starte, welcher dann wiederum den Prozess erzeugt um die Setup.exe aufzurufen.
Aber dies ist ja ebenfalls nicht Sinn der Sache.Mfg Tobi
-
Offensichtlich sendet das Programm, dass Du startest evtl. nachrichten an den Parent Prozess.
Da Du mit WaitForSingleObject keine Nachrichten abarbeitest blockiert das ganze evtl.Versuche mal so vorzugehen:
1. Disable Dein Main Window, damit es keine Rekursionen gibt.
2. Starte den Prozess mit ShellExecute
3. Lass dann eine Nachrichten Loop laufen, die enfach zyklisch auch prüft ob der Prozess auch zu Ende ist.HTH
-
Guten Morgen zusammen,
ich habe nun eine gute Lösung gefunden.
Im Prinzip löst es denke ich das gleiche Grundproblem wie die Idee von Martin.
Ich muss vor dem WaitForSingleObject einfach WaitForInputIdle() aufrufen da dies wartet bis der Prozess vollständig initialisiert ist. Dann funktioniert es.
Nun ist mir auch klar wieso es funktioniert hat als ich noch einen Thread dazwischengeschaltet hatte. Also Main Prozess -> startet Thread -> startet *.exe Prozess. Hier wurde der Mainprozess nicht blockiert da der zweite Prozess in einem separaten Thread gestartet wurde.
Nur ist mir noch nicht klar, wieso das nur bei manchen Anwendungen nicht funktioniert hat. Ich vermute das es im Wesentlichen mit MFC Anwendungen Probleme gibt, da hier die Initialisierung irgendwie verzögert abläuft so das das Zeitproblem und somit das Hängenbleiben resultiert.
Aber das ist nur eine Vermutung. Vielleicht ist das ja jemandem klarer.Danke,
Tobi