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.