WndProc in klasse?



  • merker schrieb:

    [...] Um die "WinProc" in eine Klasse zu kriegen, braucht man immer zwei davon [...]

    Nop, eine reicht theoretisch aus, musst es halt via SetWindowLong(Ptr)/GetWindowLong(Ptr) machen.



  • ok, ich verstehs - man kann mit CreateWindowEx mit this den Zeiger auf die Instanz an den Wndproc Schicken.
    kompilieren lässt sich das jetzt, das programm zeigt jedoch eine Fehlermeldung und stirbt >.<. Beim Debuggen gibts eine Zugriffsverletzung beim Lesen, siehe hier:

    http://xcpp.de/ASE/mist.jpg

    hab schrittweise debuggt - er kommt ohne probleme bis zur CreateWindowEx Zeile, wenn er dann bei "...this)..." ankommt, springt in diese komische dbgheap Datei und stirbt, bzw. zeigt zugriffsverletzungsfehlermeldungsfenster an.

    irgendwie peil ich das doch net so ganz... 😞



  • Black Shadow schrieb:

    Hm kannst du das näher erläutern? Also bei meinem VC++ geht das wunderbar, genauso gehe ich davon aus dass das Visual Studio damit auch gut zurechtkommt. Wies bei anderen Marken aussieht kann ich nicht sagen.
    Und bei welchen Compiler-settings geht der Code nicht?

    Nicht x86 32 Bit? ZB Win64. Der von dir gepostete Code ist ein ziemlich übler Hack und absolut unnötig, da es hierfür elegantere Wege gibt. Beherzige Jochen's Rat und verwende sowas nicht.

    edit:
    @Azrael
    "Zugriffsverletzung beim Lesen an Position 0xcdcdcdcd"
    Das ist die typische Signatur beim MSC für nicht initialisierten Speicher im Debug Build. Ich würde mal stark vermuten, du hast einen nicht initialisierten Zeigen.



  • Azrael, il Meraz schrieb:

    hab schrittweise debuggt - er kommt ohne probleme bis zur CreateWindowEx Zeile, wenn er dann bei "...this)..." ankommt, (...)

    Der this-pointer hat so seine Tücken. Über den this-pointer könnte man ein ganzes Forum vollposten.

    Hast Du drauf geachtet, dass

    -> die statische WndProc,
    -> die Instanz-WndProc und
    -> der Aufruf von CreateWindowEx ()

    sich in ein und derselben Klasse befinden ?

    Falls ja und der gleiche Fehler tritt immer noch auf, dann füge dem Aufruf von CreateWindowEx () mal folgendes hinzu :

    CREATESTRUCT cstr;
     cstr.lpCreateParams = (LPVOID) this;
     HWND hWnd =
     CreateWindowEx (0x00000208,AppName,0,0x90CC0880,4,4,300,200,0,0,hInst,&cstr);
    

    Dadurch wird sichergestellt, dass dort wo der letzte Parameter von CreateWindowEx () hinzeigt, sich auch ausreichend gültiger Speicher befindet.



  • fehler tritt immer noch auf, nun springt er jedoch in eine andere DAtei. Am ende dieses codes:

    void __cdecl _unlock (
            int locknum
            )
    {
            /*
             * leave the critical section.
             */
            LeaveCriticalSection( _locktable[locknum].lock );
    }
    

    meldet der Debugger einen Fehler

    Bin noch ein bisschen schlauer geworden: die Zugriffsverletzung ist bei der adresse: 0xcdcdcdcd, das hWnd hat auch den Wert 0xcdcdcdcd. Na gut, damit bin ich zwar auch nicht schlauer, aber wenigstens etwas. Irgendwie kann ich diesen Fehler überhaupt nicht nachvollziehen.

    Ich weiß, ich bin manchmal etwas schwer von begriff. Aber irgendwie muss ich das ja lernen xD. Vielen Dank auch an alle, die bisher geholfen habe - mir fällt grad auf, dass ich mich noch kein einziges mal bedankt habe *blush*



  • hilfe! ^^"
    (sorry für doppelpost)



  • Woah - habs hingekriegt, hurrrrrrrraaaaaaa!!!!!!!!!!!!!!!!!

    hatte aus versehen in der Klassendefinition und in der funktionsdefinition ein WNDCLASSEX wcex stehen, lag doch nicht am this zeiger, muhaha. Danke an alle nochmal^^



  • so - ist zwar jetzt ein 4fach Post, aber es gibt immer noch ein Problem:
    Zwar lässt sich alles wunderbar kompilieren und starten, aber wenn ich versuche, irgendeine Nachricht zu verarbeiten, spuckt er mir eine "Debug assertion Fehler"meldung aus, das ist für mich vielzu tief in irgendetwas C-internem gebohrt, davon hab ich keine ahnung mehr, kann vllt. doch jemand ein tipp geben, worans liegen könnte?



  • Azrael, il Meraz schrieb:

    aber wenn ich versuche, irgendeine Nachricht zu verarbeiten, spuckt er mir eine "Debug assertion Fehler"meldung aus,

    Was denn für eine Nachricht ? Wenn sich das Programm starten lässt, dann hat es doch schon etliche Nachrichten verarbeitet (WM_CREATE, ...) ohne Fehlermeldung ?



  • WM_CHAR wird verarbeitet. sogar wenn die nachricht garnichts macht, kommt ein fehler, sobald man eine Taste drückt. alt-f4 verträgt er genauso schlecht....



  • Azrael, il Meraz schrieb:

    sobald man eine Taste drückt

    Kontrolliere mal WM_KEYDOWN, WM_KEYUP.



  • dasselbe - assertion failure 😞



  • Poste mal den Code einer Stelle wo der Fehler auftritt.



  • zuerst:
    http://xcpp.de/ASE/dbgass.jpg
    dann
    http://xcpp.de/ASE/fehler.jpg

    das ist irgendwas c/c++ internes - delete operator...
    hab nicht explizit aufgerufen, deswegen k.a 😞

    hier mal meine ganze projektmappe als rar:

    http://xcpp.de/ASE/ASE.rar

    wäre zuviel code zum posten, obwohl das net viel ist^^



  • Streich die Variable "TCHAR * aseAppName" aus der ASE.h und kommentiere in der ASE.cpp sämtliche Codezeilen aus, die auf "aseAppName" zugreifen.
    Ein "delete aseAppName" sitzt an der falschen Stelle und verursacht den Fehler. Ausserdem wird sie nicht gebraucht.



  • was ist das denn? oO. xDDDDDDDDDDDDDDDDDDDDDD

    vielen vielen vielen vielen vielen vielen vielen vielen vielen vielen vielen vielen vielen vielen vielen vielen vielen vielen vielen vielen vielen vielen vielen vielen vielen vielen vielen vielen vielen vielen vielen vielen vielen vielen vielen vielen vielen vielen Dank, du hast mir das leben gerettet - juhu, jetzt kanns endlich weitergehen. super.

    aber was war denn das falsche jetzt? das im Destruktor? Wieso isn das falsch, dafür wird doch zuvor speicher reserviert oO.



  • Hab mir das jetzt nicht angeguckt ... aber

    TCHAR* szString = new TCHAR[256];
    // etwas damit machen
    delete [] szString;
    

    ist eigentlich korrekt.



  • Azrael, il Meraz schrieb:

    aber was war denn das falsche jetzt?

    Im Grunde genommen nur eine einzige Codezeile :

    bool ASE::CreateWClass(HINSTANCE hInst, TCHAR * AppName)
    {
    //...
     aseAppName = AppName;
    //...
    }
    

    Überleg mal was "delete aseAppName" im Destruktor fatalerweise freigegeben hat. Da kommst Du bestimmt von selbst drauf. 🙂



  • oh, stringkonstante gelöscht xD. (bzw. versucht)
    hätte es wohl wenn schon mit memcpy machen sollen. werds wohl auch tun - später sollen paar childwindows rein. danke nochmal ^^



  • 'tschuldigt, dass ich diesen alten Thread wieder ausgrabe. Allerdings habe ich noch eine Frage zu diesem Abschnitt:

    if (uMsg == WM_CREATE)
        SetWindowLong (hWnd, GWL_USERDATA, (LONG) ((LPCREATESTRUCT) lParam)->lpCreateParams);
    
    GAMESCENES *pThis = (GAMESCENES *) GetWindowLong (hWnd, GWL_USERDATA);
    

    könnte man diesen Teil nicht vereinfachen? ich habe mir das so vorgestellt:

    if (uMsg == WM_CREATE)
        CLASS *pThis = (CLASS *) ((LPCREATESTRUCT) lParam)->lpCreateParams)
    

Anmelden zum Antworten