virtual member -> vtable problem



  • Isst inzwischen nachgezogen. Ändert aber erst mal nichts an dem Fehler. 🙂



  • sagmal schrieb:

    VirtualDreams schrieb:

    Hallo allerseits,

    ...
    Zitat: "Ich habe ein Programm geschrieben und das funst nich. Warum nich 😕 Jetzt warte ich schon über 10 Minuten und es hat immer noch keiner geantwortet. 😡 Könnt ihr das nich ?"

    Verarscht du dich mit deiner Signatur selbst?

    Nein, ist schon lange her aus dem Delphiforum von einem neuen User ^^



  • nimm mal nen debugger und schau wo es crasht



  • case WM_CREATE:
                return OnCreate(hwnd, wParam, lParam); //hier stürzt er ab
                break;
    
            case WM_DESTROY:
                return OnDestroy(hwnd, wParam, lParam); //hier stürzt er ab
                break;
    

    Er schafft es nicht die beiden Funktionen aufzurufen:

    -		this	0x0029efb8	Window * const
    -		__vfptr	0x0029f7b0	*
    		[0x0]	0x00ce780c const Window::`vftable'	*
    		[0x1]	0xcccccccc	* //fehler
    		[0x2]	0x0029f864	*
    


  • VirtualDreams schrieb:

    virtual ~MyWindow() //  ...
    

    Das ist m.E. überflüssig, weil der Destruktor jetzt in der Basisklase virtual ist und es damit auch in der abgeleiteten Klasse sein sollte.
    Der Grund für den Fehler sollte das aber eigentlich nicht sein. Hm.



  • if(msg == WM_CREATE) {
        SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)lParam);
    }
    Window *wnd = (Window*)GetWindowLongPtr(hwnd, GWLP_USERDATA);
    

    Sicher, dass das so richtig abläuft?



  • David_pb schrieb:

    if(msg == WM_CREATE) {
        SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)lParam);
    }
    Window *wnd = (Window*)GetWindowLongPtr(hwnd, GWLP_USERDATA);
    

    Sicher, dass das so richtig abläuft?

    Ja, wenn virtual entfernt ist funktioniert das einwandfrei.



  • VirtualDreams schrieb:

    Ja, wenn virtual entfernt ist funktioniert das einwandfrei.

    Was nicht heißt das dein Code korrekt ist...



  • Reduzier dein Problem auf das Wesentliche. Überprüfe, ob der Fehler immer noch auftritt, wenn du die Windows-Anweisungen weglässt, bis du nur noch leere Klassen hast. So kannst du relativ schnell feststellen, welcher Codeteil für den Fehler verantwortlich ist.



  • Witziger Fehler, hab es gefunden

    Statt

    SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)lParam);
    

    muss es so gemacht werden

    Window *w = (Window*)((LPCREATESTRUCT)lParam)->lpCreateParams;
    SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)w);
    

    da lParam nur ein weiterer Pointer auf die Struct ist. Hab es nur dadurch gefunden weil lParam den pointer auf die vtable enthalten hatte...

    Trotzdem vielen Danke für eure Mühe! 🙂



  • VirtualDreams schrieb:

    Witziger Fehler, hab es gefunden

    Statt

    SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)lParam);
    

    muss es so gemacht werden

    Window *w = (Window*)((LPCREATESTRUCT)lParam)->lpCreateParams;
    SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)w);
    

    da lParam nur ein weiterer Pointer auf die Struct ist. Hab es nur dadurch gefunden weil lParam den pointer auf die vtable enthalten hatte...

    Neiiiin, ehrlich? 🙄


  • Mod

    Was hat das alles mit Standard-C++ zu tun?



  • Jetzt nichts mehr, ich dachte erst, es würde was mit virtuellen Membern zu tun haben.

    [quote="David_pb"]

    VirtualDreams schrieb:

    Witziger Fehler, hab es gefunden

    ...

    Neiiiin, ehrlich? 🙄

    Bitte weniger Sarkastisch, ich hatte es einfach vergessen, das da noch ne struct dahinter hängt. Keiner ist perfekt...



  • [quote="VirtualDreams"]Jetzt nichts mehr, ich dachte erst, es würde was mit virtuellen Membern zu tun haben.

    David_pb schrieb:

    VirtualDreams schrieb:

    Witziger Fehler, hab es gefunden

    ...

    Neiiiin, ehrlich? 🙄

    Bitte weniger Sarkastisch, ich hatte es einfach vergessen, das da noch ne struct dahinter hängt. Keiner ist perfekt...

    Ich hab dir doch sogar nen Tipp gegeben...



  • OK, dann hab ich falsch interpretiert. Bin ja noch den Dingen nachgegangen, aber muss einfach nur übersehen haben ^^


Anmelden zum Antworten