none
Abstuerze in CFrameImpl AddFrame bzw. RemoveFrame RRS feed

  • Allgemeine Diskussion

  • Hi,

    ich bekomme recht viele Minidumps mit Abstürzen in CFrameImpl::AddFrame
    bzw. CFrameImpl::RemoveFrame.

    Wenn ich FrameEx's nicht korrekt per Destroy sondern nur per Delete
    entsorge, kann ich die Probleme ja "provozieren", da die globale Liste
    von MFCNext über OnCreate/OnDestroy verwaltet wird.
    Und ein OnCreate ohne passendes OnDestroy hinterlässt in der globalen
    Liste einen ungültigen Pointer - ich habe meinen Absturz reproduziert.

    Ich habe bereits mehrmals die Quelltexte geprüft - eigentlich werden alle meine
    Frames korrekt entsorgt.
    CMDIChildWndEx etc. verwende ich nicht direkt, sondern ich habe eine eigene
    Basisklasse.
    Ich habe alle ...Ex's im Destruktor analog ~CWnd erweitert:

    CMyMDIChildWndEx::~CMyMDIChildWndEx()
    {
     SafeDestroyInDestructorBeiBedarf(this);
    }
    (analog ~CMyFrameWndEx)

    und
    template <class CWndClass>
    void SafeDestroyInDestructorBeiBedarf(CWndClass *pWnd)
    {
     if (pWnd!=NULL &&
       pWnd->m_hWnd != NULL &&
       pWnd != (CWnd*)&CWnd::wndTop && pWnd != (CWnd*)&CWnd::wndBottom &&
       pWnd != (CWnd*)&CWnd::wndTopMost && pWnd != (CWnd*)&CWnd::wndNoTopMost)
     {
       CString Name(typeid(*pWnd).name());
       TRACE("Warning: calling DestroyWindow in %s::~%s\nOnDestroy or PostNcDestroy in derived class will not be called.!\n", Name.GetString(), Name.GetString());
        ASSERT(FALSE);
        CFrameWnd *pFrame=dynamic_cast<CFrameWnd *>(pWnd);
       if (pFrame)
         CFrameImpl::RemoveFrame(pFrame);
       pWnd->DestroyWindow();
     }
    }

    D.h. selbst wenn der Frame nicht korrekt entsorgt wurde sollte es sich selber aufräumen.
    Leider trudeln auch mit der neuen Programmversion weiterhin Abstürze
    aus CFrameImpl::AddFrame/RemoveFrame ein.

    Eine erneute Suche nach "CFrameWndEx", "CMDIChildWndEx" hat ergeben, dass ich diese
    Basisklassen nicht verwende. Ich verwende nur "meine" mit dem angepassten Destruktor.

    Hat jemand eine Idee?
    Bin ich vielleicht auf dem Holzweg und der Fehler hat eine ganz andere Ursache?

    Tschüß, Holger.

    Freitag, 1. April 2011 09:37

Alle Antworten

  • ***********************************************************************************************************
    Dieser Thread wurde mangels weiterer Beteiligung des Fragestellenden ohne bestätigte Lösung abgeschlossen.
    Neue Rückfragen oder Ergänzungen zu diesem Thread bleiben weiterhin möglich.
    ****************************************************************************************************************
    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Montag, 5. Dezember 2011 14:13
    Moderator