Fenster schließt,...Programm beendet sich aber nicht



  • Hallo ich habe folgendes Problem mit meinem Programm:

    Wenn ich mein Programm debugge funktioniert es normal bis ich es schließen will. Klicke ich auf das "X" im Fenster, dann schließt zwar das Fenster, das Programm aber bleibt weiter offen.
    Wenn ich darauf hin das debuggen beende, bekomme ich einen "Assert failure". Leider blitzt der nur so kurz auf, so dass man keine Chance hat ihn zu lesen. Er öffnet und schließt sich gleich wieder, da sich durch die Beendigung des des debuggens auch die Fehler Messagebox schließt.

    Wenn ich die exedatei des Programmes ausführe und das Fenster schließe, schließt sich auch nur das Fenster und nicht das Programm. Ich habe dies mit dem Taskmanager überprüft, der den Prozess auch nach dem schließen des Fensters anzeigt.

    Könnte es evtl. sein. dass ich vergessen habe irgend einen Pointer zu löschen?

    Ich hoffe es weiß jemand Rat.

    bye bye Andi

    PS: Ich programmiere mit MS VS 2003.net. Greife in meinem Programm auf eine Webcam zu



  • WEnn ich daraufhin mein das debuggen beende, bekomme ich einen "Assert failure", den ich leider nicht lesen kann, das er zuschnell wieder den ich aber nicht lesen kann, da da er zuschnell wieder verschwindet.

    Das jetzt bitte einmal auf Deutsch 😉



  • oooh sorry, was ist mir den da passiert??

    Ich habe es geändert.



  • Zeig doch 'mal deine Message-Loop und deine Window Procedure!

    Greetz, Swordfish



  • ok hier ist mein Message Loop und der Windows Proc

    __declspec(dllimport)void SetHWND(HWND hd);
    
     __declspec(dllimport)int CheckColor(int iFarbe);
    
    #define MAX_LOADSTRING 100
    
     LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        PSTR szCmdLine, int iCmdShow)
    {
    
        static char szAppName[] = "Name" ;
        HWND        hwnd ;
        MSG         msg ;
        WNDCLASSEX  wndclass ;
    
        wndclass.cbSize        = sizeof (wndclass) ;
        wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
        wndclass.lpfnWndProc   = WndProc ;
        wndclass.cbClsExtra    = 0 ;
        wndclass.cbWndExtra    = 0 ;
        wndclass.hInstance     = hInstance ;
        wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
        wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
        wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
        wndclass.lpszMenuName  = NULL ;
        wndclass.lpszClassName = szAppName ;
        wndclass.hIconSm       = LoadIcon (NULL, IDI_APPLICATION) ;
    
        RegisterClassEx (&wndclass) ;
    
        hwnd = CreateWindow (szAppName, "Fenstername", WS_OVERLAPPEDWINDOW,
    			  CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
    			  NULL, NULL, hInstance, NULL) ;
    	SetHWND(hwnd);
    	//Sleep(5000);
    
    	ShowWindow (hwnd, iCmdShow) ;
        UpdateWindow (hwnd) ;
    
        while (GetMessage (&msg, NULL, 0, 0))
    	{
             TranslateMessage (&msg) ;
             DispatchMessage (&msg) ;
        }
        return msg.wParam ;
    }
    
    LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
    {
    	switch (iMsg)
    	{
    
    		case WM_CREATE : 
    
    			//return 0 ;
    
    		case WM_PAINT :
    			//return 0;
    
    			break; 
    
    		//    return 0 ;
    
    		case WM_KEYDOWN :
    
    				switch(wParam)
    				{
    					case VK_SPACE:
    	//					if (testTeil(1) =  true)
    
    			        MessageBox(hwnd, "blabla", "Error", iMsg);
    					return 0;
    				}
    
    		case WM_DESTROY :
    			PostQuitMessage (0);	
    
    		default:
    			break;
     	}
    
        return DefWindowProc (hwnd, iMsg, wParam, lParam) ;
    

    Ich glaube aber nicht, dass das Problem daran liegt. Viel eher wird es in der DLL Datei liegen. Ich denke dass es in der Stopp() liegt. Wenn ich das Programm durchsteppe, dann bleibt das Programm in der stop() hängen.

    Hier:

    CGetVideo::~CGetVideo()
    {
    	HRESULT result;
    
    	result= this->Stop(); // heir bleibt mein Programm hängen
    	result= graph->RemoveFilter(this);
    	result= rnd->Release();
    	result= rnd->Release();
    	result= rnd->Release();
    
    }
    

    Wenn die Stop() auskommentiere dann liefer graph 0x80040224 zurück. Demnach sind meine Filter nicht gestoppt.
    Was auich interessant ist, ist dass wenn ich dem Prozess im Taskmanager eine höhere Priorität gebe, dann läuft das Programm fehlerfrei.
    Gibt es vielleicht eine andere Methode um sämtliche Filter des Programmes zu stoppen?

    zur kurzen Erklärung des Programmes:

    Mit der CGetViedeo Klasse hole ich mir einen Videostream von einer Webcam. Diese Klasse ist in der DLL Datei geschrieben. Die Bildinformationen übergebe ich dann in ein anderes Programm, dass auf die DLL zugreift.

    Hoffentlich bin ich jetzt noch im richtigen Forum, da das schon wieder directX Programmierung ist. Am Anfang bin ich aber von einem reinem WinAPI Problem ausgegangen.



  • Ok, mal gucken...

    LRESULT CALLBACK WndProc( HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam )
    {
        switch( iMsg ) {
    
            case WM_CREATE:
                return 0; // wesshalb auskommentiert?
    
            case WM_PAINT:
                return 0; // wesshalb auskommentiert?
    
            case WM_KEYDOWN:
                switch( wParam ) {
    
                    case VK_SPACE:
                        // if( testTeil( 1 ) = true ) zuweisung an einen Funktionsaufruf?
                        //
                        // wohl eher: if( testTeil( 1 ) == true )
                        // oder einfach:
    
                        if( testTeil( 1 ) ) {
    
                             // MessageBox( hwnd, "blabla", "Error", iMsg );
                             // die gesendete Message als Style für die MessageBox!?
    
                             MessageBox( hwnd, "blabla", "Error", MB_OK );
    
                        }
                        return 0;
                    }
                return 0; // fehlt meines Erachtens.
    
            case WM_DESTROY:
                PostQuitMessage( 0 );
                return 0; // fehlt meines Erachtens.
    
            // default:    \ _ Überflüssig 
                // break;  /   da "default" sowieso return DefWindowProc (hwnd, iMsg, wParam, lParam); sein sollte
         }
    
         return DefWindowProc (hwnd, iMsg, wParam, lParam);
    }
    

    zu deiner WinMain:

    // ...
    
        // static char szAppName[] = "Name";
        // wohl eher:
    
        const char szAppName[] = "Name";
    
        // ...
    

    Da ich mich mit DirectX bisher nur sehr kurz beschäftigt habe und die interna deines Programms nicht kenne kann ich dir nicht sagen, wie die deine Filter "stoppen" sollst. Wie wär's wenn du mal in die

    CGetVideo::Stop();
    

    "reinjumpst" und sie durchsteppst, bis die Speicherverletzung auftritt?
    Mein Gefühl sagt mir, daß du über Puffergrenzen schreibst.

    Greetz, Swordfish



  • zuden "retun"s

    es ist egal ob die returns auskommentiert oder nicht sind. Der Fehler tritt auf jedenfall auf.

    "=" in der if Schleife
    Danke, habe ich nnoch nicht bemerkt, ist aber nicht die Fehlerursache, da es auch auskommentiert ist.

    Den Fehler tritt nun definitiv in der Stop() auf, alles andere müsste einwandfrei funktionieren. Ich habe eine Test Dll-Datei geschrieben dur nur eine Varbiable übergibt. wenn ich das mache läuft die WinAPI Application fehlerfrei.

    Ich glaube das ist jetzt wohl eher ein Fall für das directX Forum wo ich nun einmal als nächstes reinschreiben werde.

    @Swordfish
    vielen Dank für deine Hilfe auch wenn es (fast) nichts gebracht hat.



  • Hi Everbody und 'n Special Greet an Swordfish 😉

    ... ->

    LRESULT CALLBACK WndProc( HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam )
    {
        switch( iMsg ) {
    
            case WM_CREATE:
                return 0; // wesshalb auskommentiert?
    
            case WM_PAINT:
                return 0; // wesshalb auskommentiert?
    
            case WM_KEYDOWN:
                switch( wParam ) {
    
                    case VK_SPACE:
                        // if( testTeil( 1 ) = true ) zuweisung an einen Funktionsaufruf?
                        //
                        // wohl eher: if( testTeil( 1 ) == true )
                        // oder einfach:
    
                        if( testTeil( 1 ) ) {
    
                             // MessageBox( hwnd, "blabla", "Error", iMsg );
                             // die gesendete Message als Style für die MessageBox!?
    
                             MessageBox( hwnd, "blabla", "Error", MB_OK );
    
                        }
                        return 0;
                    }
                return 0; // fehlt meines Erachtens.
    
            case WM_DESTROY:
                PostQuitMessage( 0 );
                return 0; // fehlt meines Erachtens.
    
            // default:    \ _ Überflüssig 
                // break;  /   da "default" sowieso return DefWindowProc (hwnd, iMsg, wParam, lParam); sein sollte
         }
    
         return DefWindowProc (hwnd, iMsg, wParam, lParam);
    }
    

    daraus würd ich mal das machen:

    LRESULT CALLBACK WndProc( HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam )
    {
        switch(iMsg)
        {
            case WM_KEYDOWN:
                switch(wParam)
                {
    
                    case VK_SPACE:
                        if(testTeil(1)) // bei einer Anweisung sind KLammern hier überflüssig
                             MessageBox( hwnd, "blabla", "Error", MB_OK );
                        break;
                }
                break;
    
            case WM_CLOSE: // bekommt deine App. beim Klick auf das 'X'...das
                           // fehlt meiner Meinung nach in deiner WndProc...siehe
                           // auch Beschreiobung der MSDN zu WM_CLOSE (kein Bock zu tippen :-D )
            case WM_DESTROY:
                PostQuitMessage(0);
                break;
    
            default:
                return (DefWindowProc (hwnd, iMsg, wParam, lParam));
         }
         return (0);
    }
    

    Ein break heißt dann immer 'return (0)' (Klammern sind hier nat. nur Schönheit) - auch sehr wichtig - 😃



  • CodeFinder schrieb:

    ...
            case WM_CLOSE: // bekommt deine App. beim Klick auf das 'X'...das
                           // fehlt meiner Meinung nach in deiner WndProc...siehe
                           // auch Beschreiobung der MSDN zu WM_CLOSE (kein Bock zu 
    ...
    

    probier dies:

    ...
            case WM_CLOSE:
            ExitProcess(0);
    ...
    

    der prozess ist schneller weg als du gucken kannst 😉
    break, return, etc. ist alles nicht nötig nach 'ExitProcess()'



  • aber nicht sehr schön 👎



  • CodeFinder schrieb:

    aber nicht sehr schön 👎

    was heisst 'schön' 😕
    schnell und wirkungsvoll muss es sein 🙂



  • Servus CodeFinder, auch wieder 'mal da?

    ➡ hier geht's weiter...

    Greetz, Swordfish



  • Swordfish schrieb:

    Servus CodeFinder, auch wieder 'mal da?

    ➡ hier geht's weiter...

    Greetz, Swordfish

    Jo, war im Urlaub :p

    Danke für die Weiterleitung 👍



  • net schrieb:

    probier dies:

    ...
            case WM_CLOSE:
            ExitProcess(0);
    ...
    

    der prozess ist schneller weg als du gucken kannst 😉
    break, return, etc. ist alles nicht nötig nach 'ExitProcess()'

    Danke hat wunderbar funktioniert!!

    So wie es aussiehrt ist mein Fehler jetzt weg. Ich muss noch ein paar Tests machen, aber bis jetzt ist der Fehler nicht mehr aufgetaucht.

    -----------
    edit: ich habe nur ein paar Emutionen gelöscht als ich gemerkt habe, dass das Programm nicht funktioniert



  • Falscher Alarm!!

    nach intensiven testen habe ich gemerkt, dass der Fehler doch noch auftritt.

    😞 😞

    Es schließt sich nicht einmal das Fenster, das Programm stürzt einfach ab.

    Ich könnte heulen!!



  • Hast dus mal mit meiner (konvetiuonellen) Methode gemacht, also ohne ExitProcess(0) ?



  • nein habe ich nicht, ich wüßte auch garn nicht mit welchen.

    wie es scheint, könnte es ja sein, dass du mehr weisst wie ich 😉

    darum danke ich dir jetzt schon einmal!!!



  • LOL ?!, na so, wie ich schon mal gepostet hab:

    CodeFinder schrieb:

    Hi Everbody und 'n Special Greet an Swordfish 😉

    ... ->

    LRESULT CALLBACK WndProc( HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam )
    {
        switch( iMsg ) {
    
            case WM_CREATE:
                return 0; // wesshalb auskommentiert?
    
            case WM_PAINT:
                return 0; // wesshalb auskommentiert?
           
            case WM_KEYDOWN:
                switch( wParam ) {
    
                    case VK_SPACE:
                        // if( testTeil( 1 ) = true ) zuweisung an einen Funktionsaufruf?
                        //
                        // wohl eher: if( testTeil( 1 ) == true )
                        // oder einfach:
    
                        if( testTeil( 1 ) ) {
    
                             // MessageBox( hwnd, "blabla", "Error", iMsg );
                             // die gesendete Message als Style für die MessageBox!?
    
                             MessageBox( hwnd, "blabla", "Error", MB_OK );
    
                        }
                        return 0;
                    }
                return 0; // fehlt meines Erachtens.
    
            case WM_DESTROY:
                PostQuitMessage( 0 );
                return 0; // fehlt meines Erachtens.
    
            // default:    \ _ Überflüssig 
                // break;  /   da "default" sowieso return DefWindowProc (hwnd, iMsg, wParam, lParam); sein sollte
         }
    
         return DefWindowProc (hwnd, iMsg, wParam, lParam);
    }
    

    daraus würd ich mal das machen:

    LRESULT CALLBACK WndProc( HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam )
    {
        switch(iMsg)
        {
            case WM_KEYDOWN:
                switch(wParam)
                {
    
                    case VK_SPACE:
                        if(testTeil(1)) // bei einer Anweisung sind KLammern hier überflüssig
                             MessageBox( hwnd, "blabla", "Error", MB_OK );
                        break;
                }
                break;
    
            case WM_CLOSE: // bekommt deine App. beim Klick auf das 'X'...das
                           // fehlt meiner Meinung nach in deiner WndProc...siehe
                           // auch Beschreiobung der MSDN zu WM_CLOSE (kein Bock zu tippen :-D )
            case WM_DESTROY:
                PostQuitMessage(0);
                break;
    
            default:
                return (DefWindowProc (hwnd, iMsg, wParam, lParam));
         }
         return (0);
    }
    

    Ein break heißt dann immer 'return (0)' (Klammern sind hier nat. nur Schönheit) - auch sehr wichtig - 😃



  • @CodeFinder... unsauberer Codestyle... evt. mal Warnings Level-4 anstellen und sehen was der zu deinem gecode sagt 😉



  • (D)Evil schrieb:

    @CodeFinder... unsauberer Codestyle... evt. mal Warnings Level-4 anstellen und sehen was der zu deinem gecode sagt 😉

    Oh What?! ^^

    Hm HowTo ? (MS Visual C++ 6.0)



  • Hm ok, habs gefunden einfach in den Linker Options
    💡

    /WARN:LEVEL
    

    angeben
    wobei LEVEL dann die Warn-Stufe angibt...

    Aber bei mir zeigt er keine Warnungen an 😕 , ...was meinst du denn genau (mit'unsauberen Codestyle')?


Anmelden zum Antworten