CloseHandle ... Fehler meinerseits? Prozess lebt weiter



  • ExitThread() und ExitProcess() beenden deinen eigenen Thread bzw. Prozess, damit dürfte dir nicht geholfen sein. Du müsstest das Hauptfenster des geöffneten Prozesses finden (ist aber nicht gerade einfach, zumal nicht jeder Prozess ein Hauptfenster haben muß) und eine WM_CLOSE Nachricht dorthin schicken. Wenn das aufgerufene Programm vernünftig ist, beendet es sich als Reaktion darauf.
    (eventuell könnte auch PostThreadMessage() helfen)

    PS: Was für ein Programm willst du überhaupt auf diese Weise steuern? Ein eigenes oder etwas fertig gegebenes?



  • Ich will lediglich eine *.exe die meine 2 Azubi-Kollegen geschrieben haben starten und dann beenden.

    Sie schreiben dass Programm, ich den passenden Dienst quasi.
    Werde mal "PostThreadMessage" anschauen.

    [edit]
    Soll ich einfach

    PostThreadMessage( processInfo.hTread, WM_CLOSE, 0, 0 )
    

    ich kann mit den letzten beiden nichts anfangen....
    Was sind das für Parameter?

    [edit2]

    if( !PostThreadMessage( (DWORD)processInfo.hThread, WM_CLOSE, 0, 0 ) )
    				WriteErrorToLog( GetLastError() );
    			else
    			{
    				WriteToLog( "Killing Process succeed." );
    
    				//In das Logfile eintragen, dass der Service beendet wurde.
    				WriteToLog( "Service stoped by Controlpanel\n\n" );
    
    				//Servicestatus zurücksetzen.
    				ServiceStatus.dwCurrentState  = SERVICE_STOPPED;
    				ServiceStatus.dwWin32ExitCode = 0;
    			}
    

    Geschrieben wird:

    [Thu Jan 10 14:07:32 2008]: Service Started
    [Thu Jan 10 14:07:32 2008]: Try to start server...
    [Thu Jan 10 14:07:32 2008]: Wait for complete start:
    [Thu Jan 10 14:07:32 2008]: Complete start successfull.
    [Thu Jan 10 14:07:32 2008]: Service works.
    [Thu Jan 10 14:07:35 2008]: Es wurde ein Fehler mit dem Code: 1444 gefunden.
    [Thu Jan 10 14:07:35 2008]: Killing Process succeed.
    [Thu Jan 10 14:07:35 2008]: Service stoped by Controlpanel
    

    1444 = Invalid Thread ID 😮 😮 😕



  • void ControlHandler(DWORD request) 
    {
    	int ok;
    
    	LPDWORD tmp;
    
    	ok = 1;
        switch( request ) 
        { 
    		//Wenn der Service gestoppt wird:
            case SERVICE_CONTROL_STOP:
    
    			if( !PostThreadMessage( processInfo.dwThreadId, WM_QUIT, 0, 0 ) )
    				WriteErrorToLog( GetLastError() );
    			else
    			{
    				WriteToLog( "Killing Process succeed." );
    
    				//In das Logfile eintragen, dass der Service beendet wurde.
    				WriteToLog( "Service stoped by Controlpanel\n\n" );
    
    				//Servicestatus zurücksetzen.
    				ServiceStatus.dwCurrentState  = SERVICE_STOPPED;
    				ServiceStatus.dwWin32ExitCode = 0;
    			}
            break; 
    
    		//Wenn der Computer heruntergefahren wird:
            case SERVICE_CONTROL_SHUTDOWN:
    			if( !PostThreadMessage( processInfo.dwThreadId, WM_QUIT, 0, 0 ) )
    				WriteErrorToLog( GetLastError() );
    			else
    			{
    				WriteToLog( "Killing Process succeed." );
    
    				//In das Logfile eintragen, dass der Service beendet wurde.
    				WriteToLog( "Service stoped because Computer is shuting down.\n\n" );
    
    				//Servicestatus zurücksetzen.
    				ServiceStatus.dwCurrentState  = SERVICE_STOPPED;
    				ServiceStatus.dwWin32ExitCode = 0;
    			}
            break;
    
            default:
    		break;
        }
    
        //Den aktuellen Status setzen.
        SetServiceStatus (hStatus,  &ServiceStatus);
    }
    

    So sieht dass aus, und ins log kommt dass:

    [Thu Jan 10 14:22:27 2008]: Service Started
    [Thu Jan 10 14:22:27 2008]: Try to start server...
    [Thu Jan 10 14:22:27 2008]: Wait for complete start:
    [Thu Jan 10 14:22:27 2008]: Complete start successfull.
    [Thu Jan 10 14:22:27 2008]: Service works.
    [Thu Jan 10 14:22:39 2008]: Killing Process succeed.
    [Thu Jan 10 14:22:39 2008]: Service stoped by Controlpanel
    

    Aber leider läuft der Prozess weiter...

    Muss ich in der *.exe Datei dess Prozesses irgendwas machen, das dass klappt?



  • Eventuell wäre es erstmal eine gute Idee, deinen Erfolg zu überprüfen, bevor du die Bestätigung rausschreibst (WaitForSingleObject() könnte helfen). Und dann muß das Zielprogramm immer noch auf deine Message reagieren - und dazu brauchst du dessen Mithilfe.

    Edit: Hast du den letzten Code auch mal mit WM_CLOSE ausprobiert?


  • Mod



  • Ja ich habe WM_CLOSE auch ausprobiert, allerdings ohne die Erolgsabfrage..

    Martin Richter schrieb:

    Ich kann es nicht mehr sehen:

    Super...
    Also:
    Du hast schon öfter geantwortet, dafür bin ich dankbar, aber ich Zitiere mal deinen Schulss vom Post

    Martin Richter schrieb:

    Der richtige Weg ist und bleibt es das/alle Main Window(s) zu zerstören und entsprechend dann (im WM_DESTROY Handler) PostQuitMessage (AfxPostQuitMessage) auszuführen.

    Super, was meinst du mit "(im WM_DESTROY Handler)"...
    Ich bin nicht sooo der gieg im C-Programmieren,
    könntest du dass nochmal ausführen,
    evtl mit psoydo -schreibt man dass so?- Code.

    Ich erwarte von dir KEINEN fertigen Code, bitte, ich will ja auch irgendwo lernen 😉 ⚠

    Eventuell nochmal ein part zur kreation dess Prozesses:

    if( CreateProcess( NULL, name, NULL, NULL, FALSE, 0, NULL, NULL, &startUpInfo, &processInfo ) )
    	{
    		WriteToLog( "Wait for complete start:" );
    
    		WriteToLog( "Complete start successfull." );
    	}
    	else
    	{
    		WriteErrorToLog( GetLastError() );
    		error = 1;
    	}
    

    Also weis ichnicht was du mit Fenster meinst oder so....





  • Interessant bestimmt, aber nur in C++,
    ich programmiere C


  • Mod

    Aus einem fremden Programm heraus bleibt einem nur WM_CLOSE an das Main-Window zu posten.

    Der Artikel, den ich schreib bezog sich nicht auf den Versuch von Extern ein Programm mit WM_QUIT zu schließen, was aber genau so verboten gehört wie der Versuch es von intern zu machen.



  • Ja ich habe es aber nicht mit WM_CLOSE geschaft den Prozess zu beenden, hast du da noch einen Tipp -du scheinst ja mächtig ahnung zu haben.-...


  • Mod

    Dann geht es eben nicht, oder Du sendest an das falsche Fenster...

    Nur mal als Beispiel: Sollte die Anwendung auf Empfang einer WM_CLOSE Nachricht eine MessagBox anzeigen mit der Frage "Änderungen speichern (j/n)", dann siehst Du alt aus.

    Man kann nicht jeden Prozess von außen regulär Beenden, wenn man keine Kontrolle über dessen User-Interface hat und nicht genau weiß was der Prozess will wenn WM_CLOSE gesendet wird...

    So ist das nunmal.



  • lippoliv schrieb:

    Interessant bestimmt, aber nur in C++,
    ich programmiere C

    Ist doch lediglich als Klasse gekapselt?



  • C hat ja keine klassen, dass ist dass Problem.

    @Martin,
    Dieser Prozess zeigt eigentlich nur eine MessageBox an, und zwar genau dann, wenn eine Nachricht über einen Port kommt,
    ansonsten is nix los...
    Er wird auch kein anderes Fenster anzeigen...
    Muss in diesem Prozess irgendwo eine "Listen"-funktion für eingehende Messages sein?


  • Mod

    Wenn dieser Prozess nur eine MessageBox anzeigt und dann beendet. Dann müsstest Du wenn Du an das richtige Fenster WM_CLOSE sendest, das Programm auch Beenden können.

    Ich frage mich aber gerade warum Du diesen ganzen Aufstand machst.

    Erst wolltest Du einen Prozess aus einem Service starten, bzw. eine MessageBox anzeigen und nun wieder schließen.

    Was soll dieser gaze Krampf?



  • Der Prozess soll mit dem Dienst beendet werden.

    Nebenbei bemerkt wird jetzt aus dem Serverprogramm für jede MessageBox quasi eine neue *.exe gestartet, die dann eine MessageBox anzeigt, damit dass Server-Programm weiter "listen" kann ob nachrichten reinkommen.

    Diese Prozesse beenden sich aber schon von selbst, nach einem Klick auf "OK" bei der MessageBox.

    Wie es aussieht läuft dass alles als "Tray"-Programm, da es wohl unmöglich ist aus einem Service eine MessageBox anzuzeigen.
    Aber der Vollständigkeit halber, würde ich schon gerne wissen wie dass läuft.


  • Mod

    Dann bau doch einfach eine veränftige EXE mit einer korrekten IPC...


Anmelden zum Antworten