Windows würgt CreateProcess ab
-
Hi, ich mal wieder ...
Mein Programm ruft mit CreateProcess() einen anderen Prozess auf, der auch brav ausgeführt wird. Mein Hauptprogramm geht dabei in SW_HIDE und wartet bis der Childprozess beendet wird. Das funktioniert auch, allerdings wenn ich Windows beende ohne vorher den Childprozess beendet zu haben, stürtzen beide Programme ab. Kann ich mit CreateProcess() das nicht irgendwie regeln, so dass bei Windows-ende einfach das Programm ganz normal beendet wird ?
-
Dir Programme stürzen nicht ab, sondenr werden von Windows nach angemessener Zeit terminiert.
Das einfachste ist, dass das Programm, das gestartet wird von selbst bei Beenden von Windows terminiert. Dann beendet sich auch Dein Programm wenn es WM_ENDSESSION behandelt. Es gibt eine Timeout Ziet die jedem Programm zusteht.
Oder aber Du behandelst WM_ENDSESSION auch in dem wartenden Programm, dann darfst Du nicht WaitForSingleObject verwenden sondern Du musst MsgWaitForMultipleObjects verwenden und weiterhin die Nachrichtenschleife laufen lassen, damit WM_ENDSESSION/WM_QUERYENDSESSION behandelt werden kann.
-
Ok danke ,ich denke ich versuch das erste

-
Also irgendwie verstehe ich nicht wie das gehen soll.
So müsste es doch eigenttlich gehen :
if(WM_ENDSESSION == TRUE) { CloseHandle( pi.hProcess ); }pi ist der handle zu meinem Prozess, wenn Windows die WM_ENDESSION Nachricht bekommt, soll er den Prozess beenden...nur warum geht es nicht ?
-
oder kann ich das auch irgendwie so machen :
if(ExitWindows) { CloseHandle( pi.hProcess ); }??
??
-
Du hast entweder keine Ahnung, wie Windowsanwendungen funktionieren, oder eine sehr abstruse Vorstellung davon, wie if arbeitet.
Martin Richter hat dir eigentlich alles gesagt, was du wissen musst. Wenn du das nicht umsetzen kannst, hast du wohl noch ein paar Lücken bei den Grundlagen.
Hat dein Programm überhaupt eine Nachrichtenschleife?
-
Also nochmal von vorne :
Ich kann also das neue Programm mit WM_ENDSESSION schliessen , wenn Windows sagt : "hey leute, jetzt wird beendet". Aber wie soll das genau funktionieren ? Ich verstehs nich.
Aus der msdn :
LRESULT CALLBACK WindowProc( HWND hwnd, // handle to window UINT uMsg, // message identifier WPARAM wParam, // end-session option LPARAM lParam );// logoff optionwerd ich nicht schlau...
Bisher hab ich halt WM_ENDSESSION/OnEndSession (mit Hilfe von Wizard) in die Nachrichtentabelle erstellen lassen. Aber wenn ich jetzt hier :
void CTimerDlg::OnEndSession(BOOL bEnding) { CDialog::OnEndSession(bEnding); // TODO: Fügen Sie hier Ihren Meldungsbehandlungscode ein. }zb. AfxMessageBox("hi"); eingebe, dachte ich das da ne Meldung kommen würde bevor Windows beendet ( während das gestartete Programm läuft).
@MFK : Also soweit ich das mitgekriegt hab ist die Nachrichtenschleife in der WinMain. Und die ist bei MFC doch gar nicht sichtbar. Wie meinst du das ? Meintest du vll. WinAPI ? Oder verwechsle ich hier was ??? *Total confused*
-
man mag es kaum glauben aber es geht tatsächlich so

Nur hab ich immer noch ein Problem. Mit folgendem Code hab ich getestet ob es geht. Wenn Windows beendet wird zeigt er mir die Message:"HI" bevor es geschlossen wird.
void CTimerDlg::OnEndSession(BOOL bEnding) { if (bEnding) AfxMessageBox("HI"); CDialog::OnEndSession(bEnding); }Aber wenn der zweite Prozess läuft den ich ja mit meinem Programm starte dann funtzt das nicht...warum das nicht funtzt kann ich mir eigentlich selber beantworten, nur weiss ich leider nicht wie ichs löse.
Wie kann ich dem Compiler klar machen das ich nicht den Hauptprozess schliessen will sondern den, den ich mit CreateProcess geöffnet habe?
-
Der der mit CreateProcess erzeugt wurde muss sich selbst beenden

Natürlich kannst du den Prozess einfach abschiessen (TerminateProcess), aber das ist wohl etwas brutal und sollte wirklich nur als Notlösung verwendet werden.
-
Er soll sich ja nicht einfach so von selbst beenden, sondern nur wenn man ihn schliesst oder Windows beendet wird. Wenn Windows beendet wird bekomme ich aber keine Rückmeldung weil mein Hauptprozess versteckt ist ( SW_HIDE ). Und auf den neuen Prozess hab ich irgendwie kein Zugriff mit WM_ENDSESSION

EDIT : Käse, nicht weil der Prozess versteckt ist, sondern weil der Prozess "wartet" geht das nicht.
-
Das zweite Programm sollte eigentlich auf die WM_ENDSESSION Anforderungen reagieren - und sich schließen. Sobald das passiert, wird auch das erste Programm aktiv und beendet sich.
(Alternativ kannst du das Warten in einen zweiten Thread auslagern und im Hauptprogramm auf Windows-Nachrichten warten)
-
Jo so hab ichs mir vorgestellt, aber während das Programm wartet reagiert leider nix auf WM_ENDSESSION. Hmmm das warten in einem zweiten Thread, jo das probier ich mal, danke für den Hinweis