SendMessage zwischen Klassen -> Speicherfehler+Absturz



  • Grüsse,
    folgendes Szenario bereitet mir arge Probleme. Ich habe eine Klasse von CWnd abgeleitet. In meiner Ansicht nutz ich diese Klasse als Steuerelement. Nun würde ich gerne in besagter Klasse eine Message schicken, so daß ich im Mainframe bzw. der Ansicht die die Klasse verwendet auf das Event reagieren kann.
    Mein bisheriger Ansatz läuft einwandfrei jedoch nur im Debugmodus:

    CWnd* pParent = AfxGetApp()->GetMainWnd()->GetParent();
    	pParent->SendMessage(TVS_HSCROLL);
    

    &

    cpp.
    ON_MESSAGE(TVS_HSCROLL, OnTreeHScroll)
    h.
    afx_msg void OnTreeHScroll();
    

    Im Releasemodus stürzt mir das Programm mit einem Speicherfehler ab. Das Problem liegt irgendwie bei SendMessage, so weit bin ich schon, jedoch weiss ich genau was dort schief geht.

    Über Hilfe wäre ich dankbar. Wenn jemand Icq hat und mich direkt kontakten möchte Nr. ist 110 900 703.

    So Far Puppet



  • Was soll denn das Parent-Fenster vom Main-Fenster sein? 😕

    Überprüfe mal den Zeiger auf das Fenster an das du die Nachricht sendest,
    ob der gültig ist. Der Debugmodus scheint dich davor zu schützen.

    Gruss
    EB



  • @EB

    Da hast du etwas missverstanden. Wie ich schrieb ist das Steuerelement der Klasse wo ich die Message abschicke ein Element im Fenster(Main-Frame) sprich das Parent IST der Main-Frame.



  • CWnd* pParent = AfxGetApp()->GetMainWnd()->GetParent();
    

    Das hast du geschrieben. Und da holst du dir zuerst ein Zeiger auf dein MainWindow, das oberste Fenster. Dieses hat keine Eltern mehr. Der Zeiger müsste also NULL sein. Und NULL dereferenzieren gibt crash.

    Was du beshreibst, wäre wenn du "im Steuerelemet sitzt" und dort den parent holst, also nur

    CWnd* pParent = GetParent();
    


  • @ Pellaeon

    Korrekt, das hatte ich gändert da besagtes auch einen Fehler schmiss. Es hilft ein kleines Stück weiter. Da der Zeiger nun nicht mehr auf NULL zeigt wird die Message korrekt an die Parentklasse geschickt. Jedoch nach Aufruf der Funktion in der Parentklasse stürzt das Programm weiter mit einem Speicherfehler ab. 😞
    Kann es sein das er abschmiert sobald er die Message hintereinander schickt oder ähnliches?



  • und der Fehler tritt weiterhin nur im Release-Modus auf?



  • und der Fehler tritt weiterhin nur im Release-Modus auf?

    Ja.



  • Niemand eine Idee?



  • In meinem Artikel sind ein paar Tips, wie man Fehler in der Releaseversion findet. 🙂
    Gerade der Artikel bei Codeproject sollte dir helfen.



  • Du musst anstatt....

    afx_msg void OnTreeHScroll();
    

    das da schreiben:

    afx_msg void OnTreeHScroll(WPARAM wParam, LPARAM lParam);
    

    Deine SendMessage Methode kannste so sein lassen. W-/LParam sind lediglich optional.

    Somit wird es im Release-Mode nicht mehr abstürzen!



  • oh man zum Glück les ich das grad, merk grad das passiert bei mir auch 😮


Anmelden zum Antworten