A.Z.R.A.E.L. Geschrieben 12. September 2002 Geschrieben 12. September 2002 Hi! Hab wieder mal ein Problem: Wie kann ich einen Prozess (beliebige *.exe) den ich mit CreateProcess() erzeugt hab, nach bestimmter Zeit killen? (z.B. 1 Minute) und die verbleibende zeit (bis dieser prozess halt gekillt wird) in einem Textfeld anzeigen?? Hoffentlich könnt ihr mir da helfen! (ich verwende Visual C++ 6.0 und Programm ist eine dialogfeldbasierende MFC-Anwendung) Gruß A.Z.R.A.E.L. Zitieren
Crush Geschrieben 12. September 2002 Geschrieben 12. September 2002 Ich würde einen Timerthread starten, der 1. das Counterfeld updated und am Ende mit ExitProcess() das Programm abschießt oder von mir aus WM_CLOSE ans Prozessfenster schickt. Zitieren
A.Z.R.A.E.L. Geschrieben 13. September 2002 Autor Geschrieben 13. September 2002 hi! das mit dem timer hab ich jetzt schon hinbekommen, nur ich kenn den neuen Prozess nicht killen! STARTUPINFO sinfo; PROCESS_INFORMATION pinfo; ZeroMemory( &sinfo, sizeof(sinfo) ); //keine Ahnung sinfo.cb = sizeof(sinfo); //was diese 3 Zeilen ZeroMemory( &pinfo, sizeof(pinfo) ); //bedeuten... (Aus Doku abgeguckt...) if(!CreateProcess(m_SWZielort, NULL, NULL, NULL, FALSE, NULL, NULL, NULL, &sinfo, &pinfo)) { return; } Sleep(1000); TerminateThread(&pinfo.hThread, GetExitCodeThread(&pinfo.hThread, &pinfo.dwThreadId)); //oder: TerminateProcess(&pinfo.hProcess, GetExitCodeProcess(&pinfo.hProcess, pinfo.dwProcessId)); //hab beides schon (erfolglos) ausprobiert! Zitieren
Klotzkopp Geschrieben 13. September 2002 Geschrieben 13. September 2002 Was gibt TerminateProcess denn zurück? Und im Falle von FALSE, was liefert GetLastError? Zitieren
A.Z.R.A.E.L. Geschrieben 13. September 2002 Autor Geschrieben 13. September 2002 TerminateProcess liefert leider False! GetLastError 0! Gibt es Prozesse die ich aufrufe und nicht killen kann???? Zitieren
Guybrush Threepwood Geschrieben 13. September 2002 Geschrieben 13. September 2002 Hast du es mal mit ExitProcess probiert? Zitieren
Klotzkopp Geschrieben 13. September 2002 Geschrieben 13. September 2002 Original geschrieben von A.Z.R.A.E.L. TerminateProcess liefert leider False! GetLastError 0!Du übergibst bei TerminateProcess die Adresse des Prozess-Handles. Da muss aber das Handle selbst hin: TerminateProcess(pinfo.hProcess, 0); // ohne & GetLastError sollte eigentlich 6 (ERROR_INVALID_HANDLE) zurückgeben. Vermutlich hast Du es an der falschen Stelle aufgerufen. Der Aufruf von GetExitCodeProcess an dieser Stelle ist übrigens sinnlos. Zitieren
Guybrush Threepwood Geschrieben 13. September 2002 Geschrieben 13. September 2002 Klotzkopp hat Recht, du mußt das ohne "&" schreiben. Allerdings mußt du trotzdem den Exitcode übergeben, aber in der Funktion GetExitCodeProcess auch ohne "&". Also so: DWORD dwExitCode; GetExitCodeProcess(pinfo.hProcess,dwExitCode); //Funktion gibt bool Wert zurück!!!! //Deshalb nicht in TerminateProcess aufrufen. TerminateProcess(pinfo.hProcess, dwExitCode); [/PHP] Das sollte eigentlich funktionieren, trotzdem wäre die Funktion [i]ExitProcess[/i] eher empfelenswert wenn der Process ohne Fehler beendet wird. Gruß wasweißich Zitieren
Klotzkopp Geschrieben 13. September 2002 Geschrieben 13. September 2002 Original geschrieben von wasweißich DWORD dwExitCode; GetExitCodeProcess(pinfo.hProcess,dwExitCode); //Funktion gibt bool Wert zurück!!!! //Deshalb nicht in TerminateProcess aufrufen. TerminateProcess(pinfo.hProcess, dwExitCode); [/PHP]Das ist, wie ich bereits sagte, Unsinn. Mit GetExitCodeProcess kann man, [b]nachdem[/b] ein Prozess terminiert ist, dessen Exit-Code abfragen. Vorher wird da nur STILL_ACTIVE herauskommen. Den tatsächlichen Exit-Code setzt man erst durch den Aufruf von TerminateProcess. [b]Das sollte eigentlich funktionieren, trotzdem wäre die Funktion [i]ExitProcess[/i] eher empfelenswert wenn der Process ohne Fehler beendet wird.[/b]Auch das ist in diesem Fall Unsinn, weil man mit ExitProcess nur den "eigenen" Prozess beenden kann, keine anderen. Zitieren
Guybrush Threepwood Geschrieben 13. September 2002 Geschrieben 13. September 2002 Mit dem Exitcode hast du recht Klotzkopp ich hab das nochmal genau nachgelesen. Aber das ist egal es klappt auch so, habs nämlich immer so gemacht:D Zu ExitProcess: Der Process wurde doch von dem Programm erstellt, also müßte er doch auch so beendet werden können. Ich will mich nicht festlegen, ich will nur sagen das ich bisher jeden Process oder Thread den ich aufgerufen habe mit der Exit anstatt der Terminate Funktion beendet habe und meine mich erinnern zu können das es einmal mit TerminateProcess nicht geklappt hat, dafür aber mit ExitProcess. Gruß wasweißich Zitieren
Klotzkopp Geschrieben 13. September 2002 Geschrieben 13. September 2002 Original geschrieben von wasweißich Mit dem Exitcode hast du recht Klotzkopp ich hab das nochmal genau nachgelesen. Aber das ist egal es klappt auch so, habs nämlich immer so gemacht:DHabe nie bestritten, dass es nicht klappt. Zu ExitProcess: Der Process wurde doch von dem Programm erstellt, also müßte er doch auch so beendet werden können. Ich will mich nicht festlegen, ich will nur sagen das ich bisher jeden Process oder Thread den ich aufgerufen habe mit der Exit anstatt der Terminate Funktion beendet habe und meine mich erinnern zu können das es einmal mit TerminateProcess nicht geklappt hat, dafür aber mit ExitProcess.Deine Erinnerung in allen Ehren, aber wie willst Du bei ExitProcess angegeben haben, welcher Prozess beendet werden sollte? Zitieren
Crush Geschrieben 13. September 2002 Geschrieben 13. September 2002 Hier liegt das Problem wohl begraben. Vermutlich gibt der Beispielcode die Antwort. Zitieren
A.Z.R.A.E.L. Geschrieben 13. September 2002 Autor Geschrieben 13. September 2002 @wasweißich: habs grad mit ExitProcess versucht... aber da schieß ich grad den Prozess vom Hauptprogramm ab und der neue Prozesse "lebt" weiter! Hast du vielleicht einen funktionierenden Beispielcode? @Crush: willst du damit sagen das mir das BS(ich hab Win2K) verbietet den Prozess zu killen den ICH erstellt hab?? hab mir den Quellcode noch nicht ganz durchgelesen, aber sieht so aus als wäre das ziemlich viel aufwand, wenn man nur einen prozess beenden will! @all: DAS MUSS DOCH IRGENDWIE LEICHTER GEHEN, ODER????? Zitieren
Klotzkopp Geschrieben 13. September 2002 Geschrieben 13. September 2002 Original geschrieben von A.Z.R.A.E.L. @all: DAS MUSS DOCH IRGENDWIE LEICHTER GEHEN, ODER????? Ich hab Dir doch gesagt, wo der Fehler in Deinem Code ist. Gehts immer noch nicht? Zitieren
A.Z.R.A.E.L. Geschrieben 13. September 2002 Autor Geschrieben 13. September 2002 @Klotzkopp: Es klappt!! Sorry, hatte das wohl überlesen.... Hab mich nämlich immer auf das ExitProcess und auf CloseHandle konzentriert! nochmals thx! Problem gelöst! :D Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.