Debug-Fehler
-
Hallo!
Beim Starten meines Programms bekomme ich ständig folgenden Debug Assertion-Fehler:
Program:...eDateien\VisualStudioProjekts\w32shell\w32d.exe
File:f:\vs70builds\3077\vc\MFCATL\ship\atlmfc\include\afxcmn.inl
Line 756Merkwürdigerweise ist dort ein Pfad auf Laufwerk f:\ angegeben. Bei mir gibt es kein Laufwerk f:\. Leider finde ich auch die Ordner nicht.
Für Eure Hilfe wäre ich sehr dankbar!
Gruß Hansi
-
Hansi 990 schrieb:
Merkwürdigerweise ist dort ein Pfad auf Laufwerk f:\ angegeben. Bei mir gibt es kein Laufwerk f:\.
Das ist der Pfad, aus dem die MFC bei Microsoft gebaut wurde. Bei dir sollte die Datei in C:\Programme\Microsoft Visual Studio .NET\Vc7\atlmfc\include stehen. Schau mal da rein und sag, was um Zeile 756 herum so steht.
-
Ich kopiere Dir mal ab Zeile 752:
_AFXCMN_INLINE long CRichEditCtrl::StreamOut(int nFormat, EDITSTREAM &es) { ASSERT(::IsWindow(m_hWnd)); return (long)::SendMessage(m_hWnd, EM_STREAMOUT, nFormat, (LPARAM)&es); } _AFXCMN_INLINE long CRichEditCtrl::GetTextLength() const { ASSERT(::IsWindow(m_hWnd)); return (long)::SendMessage(m_hWnd, WM_GETTEXTLENGTH, NULL, NULL); } #endif //!_AFX_NO_RICHEDIT_SUPPORT ///////////////////////////////////////////////////////////////////////////// #endif //_AFXCMN_INLINE
-
Hansi 990 schrieb:
_AFXCMN_INLINE long CRichEditCtrl::GetTextLength() const { ASSERT(::IsWindow(m_hWnd)); return (long)::SendMessage(m_hWnd, WM_GETTEXTLENGTH, NULL, NULL); }
Genau da haben wir das ASSERT, was Alarm schlägt. Hast du eventuell irgendwas mit einem "CRichEditCtrl" gemacht, bevor dein Hauptfenster fertig initialisiert wurde?
-
Da wird wohl die GetTextLength-Methode einer Instanz von CRichEditCtrl aufgerufen, die kein Fenster ist, oder noch kein Fenster, oder kein Fenster mehr. Wie sieht der Callstack aus?
-
Das Fenster wird in der Doc-Klasse bei OnNewDocument geöffnet.
CSyntaxColorizer sc; sc.Colorize(0, -1, &m_cRichEditCtrl); ((CRichEditView*)m_viewList.GetHead())->SetWindowText(strWindow);//RaCi_DiNa return TRUE;
-
So sieht der Code aus, der in der .cpp steht.
Bei nTextLength = pCtrl->GetTextLength(); wird eine Unterbrechung erzeugt!void CSyntaxColorizer::Colorize(long nStartChar, long nEndChar, CRichEditCtrl *pCtrl) { long nTextLength = 0; // The pointer to my rich edit control. //CRichEditCtrl* pmyRichEditCtrl; // Dump the selection text only if it contains at least one text character. /* if (pCtrl->GetSelectionType() & (SEL_TEXT | SEL_MULTICHAR))//geändert u. aus Bemerkung genommen*** { CString strText = pCtrl->GetSelText(); TRACE(TEXT("selection text is '%s'.\r\n"), (LPCSTR) strText); }*/ if(nStartChar == 0 && nEndChar == -1) //send entire text of rich edit box { nTextLength = pCtrl->GetTextLength(); //if there is alot of text in the Rich Edit (>64K) then GetWindowText doesn't //work. We have to select all of the text, and then use GetSelText pCtrl->SetSel(0,-1); } else { //set up the text buffer; add 1 because zero-based array nTextLength = nEndChar - nStartChar + 1; pCtrl->SetSel(nStartChar,nEndChar); } LPTSTR lpszBuf = new TCHAR[nTextLength+1]; pCtrl->GetSelText(lpszBuf); pCtrl->SetSelectionCharFormat(m_cfDefault); colorize(lpszBuf,pCtrl,nStartChar); delete lpszBuf; }
-
Das liegt daran, dass das Fenster zu m_cRichEditCtrl in OnNewDocument noch gar nicht erzeugt ist. Also darfst du Colorize nicht in OnNewDocument aufrufen.
-
Dann müssen wir noch einen Schritt zurückgehen: Wo wird die "Colorize()" zum ersten Mal aufgerufen? (am besten setzt du vor der Fehlerzeile eine Breakpoint und blätterst dann den CallStack zurück bis zu WinMain())
-
Du hast Recht, sobald ich den Colorizer aufruf in OnNewDokument in Bemerkung setze sind die Asserts verschwunden.
Die Frage ist nur, wo rufe ich den Colorizer sonst auf, wenn nicht in OnNewDocument? Kann man den auch in der View Klasse aufufen?
-
Hallo?
Alle in der Mittagspause?
-
Alle in der Mittagspause?
Nicht wirklich
Zu deinem Problem: Auf jeden Fall erst, nachdem du dein Fenster fertiggebaut hast. Ich würde die View-Klasse vorschlagen (oder eine später aufgerufene Methode des Doc).
(leider habe ich den genauen Ablauf der Doc/View-Initialisierung nicht im Kopf, sonst ginge das detaillierter)