Fehler: "CObject::CObject": Kein Zugriff auf private Member, dessen Deklaration in der CObject-Klasse erfolgte



  • Auf anhieb sehe ich da nichts was diesen Fehler verursachen könnte. In welcher Zeile kommt denn der Fehler?
    Es fehlt aber auf jeden Fall noch ein ReleaseDC in deiner datei_zeichnen Methode!
    EDIT: du kannst auch gleich return CPoint(x,y) schreiben, ist aber immer etwas unschön, da dann nochmal der Copykonstruktor aufgerufen wird.



  • Der Fehler tritt in der afxwin.h auf.
    Danke wegen dem Release, hatte ich vergessen.



  • Achso doch jetzt seh ichs, das Problem ist der CPen den solltest Du per Referenz oder gar nicht übergeben (also nur in Deiner Methode instanzieren).



  • Okay, jetzt ist der Fehler weg. Hab jetzt nur moveto und lineto in der Klassenfunktion.

    Jedoch stürzt mir jetzt das Programm immer ab mit einer Zugriffsverletzung:

    Unbehandelte Ausnahme bei 0x78a4335c (mfc90ud.dll) in prak6_bmt09027.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0xcc0f0f08.

    An folgender Stelle in der wincore.cpp

    bResult = m_pCtrlSite->DestroyControl();
    


  • Hast du denn auch den alten Pen wieder im DC selected, bevor du deinen Pen löschst?


  • Mod

    Was sagt der Call Stack?
    Hast Du evtl. das Control schon zerstört?



  • Also hier jetzt der angepasste Code

    void CChildView::OnDateiZeichnen()
    {
    	CDC *dc;		// Gerätekontext zum Zeichnen auswählen
    	dc = GetDC();
    
    	CFarbLinie lin;	// Instanz der Klasse CFarbLinie anlegen
    	CPen cpen;	// Instanz der Klasse CPen anlegen
    
    	FILE *fp;		// Binärdatei zum Lesen auswählen
    	fp = fopen("linien.pra","rb");
    
    	// Instanz der Klasse CFarbLinie anlegen
    	while(fread(&lin,sizeof(CFarbLinie),1,fp))		// Lese solange aus Datei, bis Ende der datei erreicht
    	{
    		cpen.CreatePen(PS_SOLID,1,lin.rgb_color());		// neues Object Pen anlegen
    		CPen *pOldPen = dc->SelectObject(&cpen);	// Object Pen mit Gerätekontext verbinden
    		lin.datei_zeichnen(dc);	// Zeichnen-Funktion aufrufen
                    dc->SelectObject(pOldPen);
    		cpen.DeleteObject();						// Object Pen löschen
    	}	
    	ReleaseDC(dc);
    
    class CFarbLinie : public CLinie	// Klasse CFarbLinie mit Basisklasse CLinie
    {
    private:
    	unsigned char r;	// Rotwert
    	unsigned char g;	// Grünwert
    	unsigned char b;	// Blauwert
    
    public:
    	COLORREF rgb_color()	// Funktion zum umwandeln der drei Werte in RGB
    	{
    		return RGB(r,g,b);	// Rückgabewert vom Typ COLORREF - RGB(r,g,b)
    	}
    
    	void datei_zeichnen(CDC *dc)
    	{
    		dc->MoveTo(get_start());					// Gehe mit Pen zu Startpunkt der Linie
    		dc->LineTo(get_end());						// Zeichne mit Pen Linie zum Endpunkt		
    	}
    };
    


  • connan schrieb:

    Hast du denn auch den alten Pen wieder im DC selected, bevor du deinen Pen löschst?

    Also ich habe ihn erstellt, dann im DC selektiert und dann gemalt.>>EDIT: Okay, ich glaube hier muss er nochmal DC->SelectObject(pOldPen) - Aber Fehler tritt trotzdem auf<<. Danach den Pen gelöscht und dann gehts ja wieder von vorn los.

    Das sollte eigentlich so passen.

    @Martin Richter: Mit CALL STACK kann ich nichts anfangen sorry. 😕



  • Vielleicht hilft das weiter:

    #ifdef _AFX_NO_OCC_SUPPORT
    	if (m_hWnd != NULL)
    		bResult = ::DestroyWindow(m_hWnd);
    #else //_AFX_NO_OCC_SUPPORT
    	if ((m_hWnd != NULL) || (m_pCtrlSite != NULL))
    	{
    		if (m_pCtrlSite == NULL)
    			bResult = ::DestroyWindow(m_hWnd);
    		else
    			bResult = m_pCtrlSite->DestroyControl();
    	}
    

    Das ist die If in der wincore.cpp, wo der Fehler auftritt an folgender Stelle: bResult = m_pCtrlSite->DestroyControl();



  • Oh, hab gerade mal wieder was gelernt zu Visual Studio, was neues entdeckt, danke Martin.

    Also ich hoffe, ich habe jetzt auch den Inhalt aus dem Call Stack Fenster:

    prak6_bmt09027.exe!CChildView::OnDateiZeichnen() Zeile 73 C++
    mfc90ud.dll!_AfxDispatchCmdMsg(CCmdTarget * pTarget=0x0034cb70, unsigned int nID=32771, int nCode=0, void (void)* pfn=0x004116a4, void * pExtra=0x00000000, unsigned int nSig=57, AFX_CMDHANDLERINFO * pHandlerInfo=0x00000000) Zeile 82 C++
    mfc90ud.dll!CCmdTarget::OnCmdMsg(unsigned int nID=32771, int nCode=0, void * pExtra=0x00000000, AFX_CMDHANDLERINFO * pHandlerInfo=0x00000000) Zeile 381 + 0x27 Bytes C++
    prak6_bmt09027.exe!CMainFrame::OnCmdMsg(unsigned int nID=32771, int nCode=0, void * pExtra=0x00000000, AFX_CMDHANDLERINFO * pHandlerInfo=0x00000000) Zeile 120 + 0x29 Bytes C++
    mfc90ud.dll!CWnd::OnCommand(unsigned int wParam=32771, long lParam=0) Zeile 2364 C++
    mfc90ud.dll!CFrameWnd::OnCommand(unsigned int wParam=32771, long lParam=0) Zeile 366 C++
    mfc90ud.dll!CWnd::OnWndMsg(unsigned int message=273, unsigned int wParam=32771, long lParam=0, long * pResult=0x0012fc90) Zeile 1769 + 0x1e Bytes C++
    mfc90ud.dll!CWnd::WindowProc(unsigned int message=273, unsigned int wParam=32771, long lParam=0) Zeile 1755 + 0x20 Bytes C++
    mfc90ud.dll!AfxCallWndProc(CWnd * pWnd=0x0034c930, HWND__ * hWnd=0x001c076a, unsigned int nMsg=273, unsigned int wParam=32771, long lParam=0) Zeile 240 + 0x1c Bytes C++
    mfc90ud.dll!AfxWndProc(HWND__ * hWnd=0x001c076a, unsigned int nMsg=273, unsigned int wParam=32771, long lParam=0) Zeile 403 C++
    mfc90ud.dll!AfxWndProcBase(HWND__ * hWnd=0x001c076a, unsigned int nMsg=273, unsigned int wParam=32771, long lParam=0) Zeile 441 + 0x15 Bytes C++
    user32.dll!7e368734()
    [Unten angegebene Rahmen sind möglicherweise nicht korrekt und/oder fehlen, keine Symbole geladen für user32.dll]
    user32.dll!7e368816()
    user32.dll!7e3689cd()
    user32.dll!7e368a10()
    mfc90ud.dll!AfxInternalPumpMessage() Zeile 183 C++
    mfc90ud.dll!CWinThread::PumpMessage() Zeile 900 C++
    mfc90ud.dll!CWinThread::Run() Zeile 629 + 0xd Bytes C++
    mfc90ud.dll!CWinApp::Run() Zeile 865 C++
    mfc90ud.dll!AfxWinMain(HINSTANCE__ * hInstance=0x00400000, HINSTANCE__ * hPrevInstance=0x00000000, wchar_t * lpCmdLine=0x000208e2, int nCmdShow=1) Zeile 47 + 0xd Bytes C++
    prak6_bmt09027.exe!wWinMain(HINSTANCE__ * hInstance=0x00400000, HINSTANCE__ * hPrevInstance=0x00000000, wchar_t * lpCmdLine=0x000208e2, int nCmdShow=1) Zeile 30 C++
    prak6_bmt09027.exe!__tmainCRTStartup() Zeile 574 + 0x35 Bytes C
    prak6_bmt09027.exe!wWinMainCRTStartup() Zeile 399 C
    kernel32.dll!7c817077()

    Leider eröffnen sich mir nun ein paar mehr Fragezeichen 😃



  • Okay, habs gelöst. In der Klasse CLinie ist mir nen :public CWnd reingerutscht.


Anmelden zum Antworten