Zeigerproblem beim Wechsel von Windows 98 auf NT



  • Hallo Leute,

    In der OnDraw-Funktion der View-Klasse einer MDI-Anwendung rufe ich eine Objektklasse auf. Als Parameter übergebe ich den Zeiger (CDC) auf das Zeichenobjekt (Bildschirmfenster oder Drucker) und das Client-Rect.
    Unter Windows 98 klappt das ohne Probleme. Unter Windows NT bekomme ich eine Fehlermeldung (Acces violation) beim Zugriff auf die Objektklasse
    welche die Zeichenroutinen enthält.

    Ich nutze VC++ Version 6. Gibt es da ein Update oder woran kann das Problem liegen?

    Vielen Dank für Eure Antworten.

    H.Sudau



  • Es gibt einen ServicePack 6 (nutz mal die Suche, war die Tage erst).

    Hast du den Zeiger ordentlich initialisiert? Sonst kann es beim Umstellen auf die Releaseversion ein Problem geben. 🙂

    Welchen Wert hat denn der fehlerhafte Zeiger?



  • Danke für die schnelle Antwort,

    Servicepack 6 habe ich heute installiert. Gleicher Fehler.
    Der Zeiger hat folgende Werte:

    CDC = 0x0012fb40 (CPaintDC hWnd = 0x0008063c

    H.Sudau



  • Zeig mal etwas Quellcode.



  • Hallo, ist nicht Windows NT sondern Windows 2000 (Verzeichnis ist WINNT)

    void CMView::OnDraw(CDC* pDC)
    {
    	CFont f;
    	f.CreatePointFont(0,"Times");
    	CFont* pAlterFont=pDC->SelectObject(&f);
    
    	pDC->SetMapMode(MM_LOMETRIC);
    
    	CRect rcClient;
    
    	if(pDC->IsPrinting())
    	{
    		rcClient = m_PrintRect;
    		pDC->DPtoLP(&rcClient);
    		pDC->SetWindowOrg(0,-rcClient.BottomRight().y);
    	}
    	else
    	{
    		GetClientRect(&rcClient);
    		pDC->DPtoLP(&rcClient);
    		pDC->SetWindowOrg(0,-rcClient.BottomRight().y);
    	}
    
    	pZBeh->Behaelter(pDC,&rcClient,1); // ab hier ist Schluß
    
    	pDC->SelectObject(pAlterFont);
    
    }
    

    Der Kopf von Behälter lautet:

    class CZBehaelter : public CObject  
    {
    public:
    	CZBehaelter();
    	virtual ~CZBehaelter();
    	void Behaelter(CDC* CDC, CRect Client, short Ansicht);
    	CMDoc*	pDoc;
    

    Beim Testen ist mir aufgefallen, daß die Releaseversion beim Erstellen neuerdings folgende Fehlermeldung bringt:

    MFC\INCLUDE\afx.inl(122) : error C2447: missing function header (old-style formal list?)

    Die betreffende Zeile lautet wie folgt:

    // CString
    //_AFX_INLINE CStringData* CString::GetData() const
    	{ ASSERT(m_pchData != NULL); return ((CStringData*)m_pchData)-1; }
    

    Kann der Fehler damit zusammenhängen?

    Gruß H.Sudau



  • Du hast irgendwo was vergessen. Entweder ein Semikolon hinter ner Klassendeklaration oder eine schließende Klammer hinter ner Funktionsdeklaration o.ä.



  • HSudau schrieb:

    // CString
    //_AFX_INLINE CStringData* CString::GetData() const
    	{ ASSERT(m_pchData != NULL); return ((CStringData*)m_pchData)-1; }
    

    Moin!

    Für mich sich das aus wie drei Zeilen, von denen die dritte nicht auskommentiert ist.
    Dann würde ich auch den Fehler verstehen, denn die Zeile so ohne Funktionskopf ist doch etwas fehlt am Platz.

    Dummerweise scheint das Code der MFC zu sein. 😕

    Ich fürchte, der Fehler selber liegt in der Funktion Behaelter, denn in dem gezeigten Code sehe ich nirgends einen CString.



  • estartu_de schrieb:

    Dummerweise scheint das Code der MFC zu sein. 😕

    Ganz genau und deshalb liegt der Fehler nicht da, sondern in seinem Code, davor.



  • Hallo,

    Danke für Eure Antworten.

    Der Fehler steckte in der formatierten Übergabe an eine String-Variable.
    Merkwürdigerweise läuft das Programm auf meinem Rechner ohne Probleme durch.
    Auf einem zweiten Rechner mit gleichem Betriebssystem stürzt das Prog ab.

    Mir ist aber trotzdem unklar warum folgender Cast nicht funktioniert:

    double a,b;
    CString Text;
    
    a = 15.2;  // z.B.
    b = 235.0;
    
    Text.Format("%i", int(a + b));
    

    Gruß HSudau


Anmelden zum Antworten