Debug Assertion Failed wincore.cpp line 880



  • Hi, ich habe folgendes Problem:
    Ich habe mir vom Codeproject eine kleine Klasse gezogen mit der man eine ProgressBar,die BMP benutzt, verwenden kann.
    Wenn ich das ganze, wie in dem Beispiel verwende funktioniert das auch. Wenn ich das jetzt bei mir einbaue, geht es nicht.
    Zur Erklärung:
    In meiner Anwendung wird die ProgressBar dann aufgerufen, wenn ich die Entertaste drücke. Nachdem das Beendet ist kommt eine weitere Funktion zum Einsatz. Und dann passiert halt der oben stehende "Fehler" in der Debugversion.

    Was könnte das sein?

    P.S.: Wenn ich das ganze per Buttonklick mache funktioniert es!!



  • ASSERT-Fehler wegen ungültigem hwnd. Benutze GetSafeHwnd().
    http://msdn2.microsoft.com/en-us/library/d64ehwhz.aspx



  • Ich bekomme das einfach nicht hin!
    Hier mal der entsprechende Code:

    void CTest_Dialog::progressStart()
    {
    	if(i<t_iAnzahl)
    	{
    	CWnd*    poProgress = NULL;
    	CBitmap* poBitmap   = NULL;
    	poProgress = &t_cProgress1;
    	int b = _ttoi((LPCTSTR) set.in_strZeit);
    	int nMultiplyDelay = 300000*b;
    
    	BOOL m_bCheckReverse = true;
      //
    	poBitmap = new CBitmap();
        poBitmap->LoadBitmap(IDB_BMP_BAR1);
    
    #ifdef dCSP_DIALOG_PROGRESS
    	m_poSkinProgress = new CSkinProgress
      (
        poProgress,
        nMultiplyDelay,
        poBitmap,
    	#ifdef dCSP_SLIDERBAR_METHOD
      m_bCheckReverse
    #endif // dCSP_SLIDERBAR_METHOD
      );
    
      //oProgressPencil.SetPos(nMultiplyDelay);
      //oProgressPencil.SetStep(+1);
    
      // 
    
    	for(int a = 0; a < nMultiplyDelay; a += 1)
      {
    		m_poSkinProgress->StepIt();
    		PeekAndPump();
    	}
    	delete m_poSkinProgress;
        m_poSkinProgress = NULL;
       // Here the CSkinProgress is deleted
    	#endif // dCSP_DIALOG_PROGRESS
    
      if(poBitmap != NULL)
      {
        delete poBitmap;
      }else{}
    	}
    	else{}
    }
    BOOL PeekAndPump()
    {
      static MSG msg;
    
      while(::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
      {
    	  if(!AfxGetApp()->PumpMessage())
        {
    		  ::PostQuitMessage(0);
    		  return FALSE;
    	  }	
      }
    
      return TRUE;
    }
    

    Und aufgerufen wird das Ganze durch:

    BOOL CTest_Dialog::PreTranslateMessage(MSG* pMsg) 
    {
        // TODO: Speziellen Code hier einfügen und/oder Basisklasse aufrufen
        // Falls Taste gedrueckt wurde
        if (pMsg->message == WM_KEYDOWN)
        {
            	if (pMsg->wParam == VK_RETURN)
    	{
                progressStart();
    			testenProzess();
    	}
    
    	if(pMsg->wParam == VK_ESCAPE)
    	{
    		OnOK();
    	}
    
    	return 0;
    	}
    
        return CDialog::PreTranslateMessage(pMsg);
    }
    

    Die Klasse ist, wie gesagt, von CodeProject. Hier mal der Link dazu:
    http://www.codeproject.com/miscctrl/cskinprogress.asp

    Ein Beispiel wäre ganz gut!

    Danke!



  • Hat denn keiner ne Ahnung, wie ich das lauffähig bekomme?



  • Debuggen und s.o.



  • Debuggen habe ich doch gemacht und da kommt er dann bei der angegebenen Zeile zum stehen. Ich kann damit aner nichts anfangen??????????????

    Bitte Hilfe!!!!!!!!!!!

    Ich komm an der Stelle nicht weiter!



  • Was steht denn da genau in Line 880? Da wird doch sicher das Fensterhandle auf Gültigkeit abgefragt?



  • Da steht folgendes:

    // should be a normal window
    		ASSERT(::IsWindow(m_hWnd));
    

    Damit kann ich leider nichts anfangen. Ich bin da noch nicht so firm. In der MFC-Programmierung. Das ganze muß doch irgendwie mit dem Thread zu tun haben. Oder halt mit der PreTranslationMessage. Denn mit einem Buttonklick funktioniert das Ganze ja!!



  • Wen es interessiert. Ich habe das Problem gelöst mit nur einer kleinen Zeile:

    In die PreTranslationMessage folgende Zeile einfügen:

    return TRUE;
    

    Und schon funktioniert es:

    BOOL CTest_Dialog::PreTranslateMessage(MSG* pMsg) 
    {
        // TODO: Speziellen Code hier einfügen und/oder Basisklasse aufrufen
        // Falls Taste gedrueckt wurde
        if (pMsg->message == WM_KEYDOWN)
        {
                if (pMsg->wParam == VK_RETURN)
        {
                progressStart();
                testenProzess();
                return TRUE;
        }
    
        if(pMsg->wParam == VK_ESCAPE)
        {
            OnOK();
        }
    
        return 0;
        }
    
        return CDialog::PreTranslateMessage(pMsg);
    }
    

Anmelden zum Antworten