VC++7.1:Ausnahmefehler nach Aufruf einer Klassenmethode

TakaBo

Mitglied
Hallo,

ich habe hier ein Problem, dass mir sehr seltsam vor kommt. Mach ich da nen Denkfehler, oder ist das wieder ein Bug in VC++7.1.

Folgendes: Ich habe einen CView. In OnCreate erzeuge ich einen CClientDC, welchen ich an die Methode Connect(CDC*) einer anderen Klasse übergebe.
Code:
int CAutoClothView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CScrollView::OnCreate(lpCreateStruct) == -1)
		return -1;

	m_pCDC = new CClientDC(this) ;

	CMainFrame* pMF=static_cast<CMainFrame*>(AfxGetApp()->GetMainWnd());
	pMF->m_Engine.Connect( m_pCDC );

In der m_Engine, welche von CATEngine abgeleitet ist, findet folgendes statt:

Code:
void CATEngine::Connect(CDC* pDC)
{
	m_pDC=pDC; //  Unbehandelte Ausnahme ?

m_pDC ist ein Zeiger auf CDC, also CDC* m_pDC. Das Ergebnis ist dann:

Unbehandelte Ausnahme bei 0x00452269 in ACloth.exe: 0xC0000005: Zugriffsverletzung-Schreibposition 0x00000748.

Weiss jemand Rat?

Gruss TB.
 
Die Frage ist wann passiert die Access Violation? Beim Aufruf der Methode oder bei der Zuweisung?
Wo wird m_Engine instanziert? Wenn du mit dem Debugger durchgehst, und in die Methode reinkommst (falls der Absturz nicht früher passiert) dann schau dir mal den "this Zeiger" an, ob der auch eine Gültige Adresse hat.

Gruß Homer
 
Code:
void CATEngine::Connect(CDC* pDC)
{
	m_pDC=pDC; //  Unbehandelte Ausnahme ?

bei der Zuweisung des Pointer pDC zu m_pDC kann kein Fehler auftreten, es sei denn das Objekt pMF->m_Engine vom Typ CATEngine ist noch nicht angelegt.
 
Danke schön!
Tatsächlich war es ein gedanklicher Fehler von meiner Seite. MFC instanziert offensichtlich erst die Views , danach den MainFrame. D.h. wenn ich versuche aus CView::OnCreate() auf ein Objekt des Mainframes zuzugreifen, existiert es eigentlich noch gar nicht, weil der MainFrame noch nicht existiert. Ergo: Die Zuweisung grabscht ins leere und erzeugt eine Zugriffsverletzung.

Hab jetzt die Übergabe des Parameters in die OnInitialUpdate() des Views gelegt, da zu diesem Zeitpunkt der MainFrame schon existiert.

Danke nochmal.

Gruss TB
 
Zurück