Error bei Serialisierung



  • Hallo,
    wenn ich ein neues Dokument mit der der Methode Serialize(CArchive &ar) öffnen möchte bekomme ich eine unbehandelte Ausnahme an folgender Stelle:

    BOOL CImageList::Attach(HIMAGELIST hImageList)
    {
    	ASSERT(m_hImageList == NULL);      // only attach once, detach on destroy
    	ASSERT(FromHandlePermanent(hImageList) == NULL);
    
    	if (hImageList == NULL)
    		return FALSE;
    
    	CHandleMap* pMap = afxMapHIMAGELIST(TRUE);
    	ASSERT(pMap != NULL);
    
    	pMap->SetPermanent(m_hImageList = hImageList, this);
    	return TRUE;
    }
    

    Der Stackpointer steht dann auf dem Code ASSERT(m_hImageList == NULL);.
    wo könnte mein Fehler liegen?


  • Mod

    Was zeigt der Callstack an?
    Kann es sein, das zu diesem Zeitpunkt noch kein Fenster vorhanden ist?
    Greifst Du aus der Serialisierung auf die GUI zu?



  • Also die ersten 3 Eintäge in der Aufrufliste sind folgende:

    >	XXX.exe!CImageList::Attach(_IMAGELIST * hImageList=0x0017d320)  Zeile 1394 + 0x1c	C++
     	XXX.exe!CImageList::Create(unsigned int nBitmapID=130, int cx=16, int nGrow=16, unsigned long crMask=32)  Zeile 1375	C++
     	XXX.exe!CLeftView::OnInitialUpdate()  Zeile 86	C++
    

    Wenn ich die Methode OnInitialUpdate() auskommentiere treten keine Fehler auf.
    Werde jetzt mal versuchen rauszufinden, welche Funktion in dieser Methode den ASSERT auslöst. Ich vermute mal das es die Funktion ist die mit meiner TreeView und der darin enthaltenen Bitmaps zu tun hat.



  • Habe nun rausgefunden wo mein Fehler liegt, aber noch nicht wie ich ihn beheben kann.

    /*creates the image list, used by the tree view*/
    	BOOL LoadBitmap(IDB_BITMAP_TREE);
    	if(m_pImageListTree != NULL)
    	{
    		m_pImageListTree->Create(IDB_BITMAP_TREE, 16, 16, ILC_COLOR32);
    	}
    

    Wenn ich nun öffnen oder neu im menu auswähle, wird dieser Code ein 2. Mal ausgeführt. Dabei kommt es zum Fehler.
    Weiß jemand wie ich dies verhindern kann?



  • Hab mein problem gelöst!! 😉 Einfach eine Kontrolvariable verwendet die überprüft ob das Objekt schon erstellt wurde.


  • Mod

    Bei einer SDI Applikation muss Dir klar sein, dass der Code in OnInitialUpdate mehrfach ausgeführt werden kann.

    1. Dein Code bzgl LoadBitmap verstehe ich nicht. Der tut nichts.
    2. Du kannst doch prüfen ob m_pImageListTree bereits erzeugt wurde.

    if(!m_pImageListTree->GetSafeHandle())
    {
        m_pImageListTree->Create(IDB_BITMAP_TREE, 16, 16, ILC_COLOR32);
    }
    

    3. Warum hast Du aus m_pImageListTree einen Pointer gmachtund keine Member Variable?



  • Danke für die Lösung mit GetSafeHandle!

    Das BOOL LoadBitmap() brauche ich, da ansonsten m_pImageListTree->Create() nicht funktioniert. Warum nicht weiß ich selber nicht.

    Warum ich einen Pointer daraus gemacht habe, keine Ahnung. Warum nicht?

    Auf jedenfall funktioniert es soweit. Gibt nur noch ein Problem:
    Nach dem ich die Serialisierung ausgeführt habe und die Werte in meinen Windows aktualisiert habe, ist mein Fenster nicht mehr maximiert.
    Weißt du warum das so ist? Und wie ich es wieder maximieren kann?
    Habe schon AfxGetApp()->m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED) versucht, doch das funktioniert nicht.
    Ich habe ein SplitterView.
    Kannst du mir weiterhelfen?


  • Mod

    maRKus23 schrieb:

    Danke für die Lösung mit GetSafeHandle!

    Das BOOL LoadBitmap() brauche ich, da ansonsten m_pImageListTree->Create() nicht funktioniert. Warum nicht weiß ich selber nicht.

    Das kan nicht sein. Dieser Code ist vollkommen sinnfrei!
    Ich merke jetzt erst, dass es eine Funktions Deklaration ist!
    Schmeiß ihn weg.

    maRKus23 schrieb:

    Warum ich einen Pointer daraus gemacht habe, keine Ahnung. Warum nicht?

    Weil Du dann selber aufräumen musst. Dasmusst Du bei einer Member-Variable nicht.

    maRKus23 schrieb:

    Auf jedenfall funktioniert es soweit. Gibt nur noch ein Problem:
    Nach dem ich die Serialisierung ausgeführt habe und die Werte in meinen Windows aktualisiert habe, ist mein Fenster nicht mehr maximiert.
    Weißt du warum das so ist? Und wie ich es wieder maximieren kann?
    Habe schon AfxGetApp()->m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED) versucht, doch das funktioniert nicht.
    Ich habe ein SplitterView.
    Kannst du mir weiterhelfen?

    FormView?
    Hast Du etwa ein ResizeParentToFit in Deinem Code für Dein Form?



  • Jap habe ne FormView mit ResizeParentToFit.



  • So habe jetzt das ResizeParentToFit entfernt und jetzt funktioniert es.
    Danke!!


Anmelden zum Antworten