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



  • 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')?



  • default: 
                return (DefWindowProc (hwnd, iMsg, wParam, lParam)); 
         } 
         return (0); 
    }
    

    Hmm so kann man es auch machen(also das mit den Warnings ;))...

    In dem oben zitierten Quellcode:
    return (0); wird NIE erreicht...



  • Doch klar nämlich immer, wenn eine Message bearbeitet wurde; break wirft mich doch aus dem switch heraus, und 'springt' dann hinter das switch, also da wo direkt 'return (0)' steht...

    Die DefWindowProc()-Funktion wird nur dann aufgerufen, wenn eine Nachricht nicht im Switch steht, und so solls ja auch sein 🙂

    PS: Hab auch nochmal EXPLIZIT getestet...funktioniert perfekt...glaub da haste dich verhaspelt 😉

    Edit: Das PS und n Vertipper.



  • DANKE!!! für alle Hilfren, aber es funktioniert noch immer nicht.

    Ich denke es ist nun wirklich ein reines DirectX Problem.

    Vielleicht kennt sich von euch jemand mit Webcamprogrammierung aus und kann m,ir da vielleicht weiterhelfen.

    Hier geht es weiter:

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-153440.html


Anmelden zum Antworten