PDA

Vollständige Version anzeigen : Visual C++ 6 - Access Violation nach CFormView::CreateDlg


rgs
22.01.2007, 12:12
Hallo zusammen.

Ich habe seit kurzem ein merkwürdiges Problem in einer VC 6 Applikation.

Zunächst: das Projekt ist bereits mehrere Jahre alt und lief bisher immer einwandfrei. Aber seit kurzem erscheint beim Öffnen eines bestimmten CFormView-Dialogs (immer bei dem selben) eine Access Violation (Debug UND Release). In einer kurz zuvor kompilierten Version funktioniert alles noch. Es wurden keine Änderungen an den Dialogeinstellungen vorgenommen. Ich habe auch bereits versucht, den betreffenden Dialog aus der Applikation zu entfernen und einen neuen einzubauen. Das Problem bleibt allerdings bestehen. Alle anderen CFormView-Dialoge der Anwendung laufen nach wie vor einwandfrei.

Ich konnte den Ablauf bis zum Aufruf von CreateDlg debuggen. Dort wird der hWnd-Zeiger der Dialog-Klasse verbogen und zeigt auf die Adresse 0xfeeefeee, die ungültig ist. Dadurch wird beim Versuch der Dialoginitialisierung die Access Violation ausgelöst.

GetLastError() liefert eigenartigerweise den Fehlercode 0 !!!

Ich bin mit meinem Latein allmählich am Ende.

Hat jemand eine Ahnung, wo das Problem liegen könnte? Ich bin für jede Anregung dankbar.

GrandInquisitor
24.01.2007, 19:24
mmmm... ich bin mir nicht sicher, ob's funktionieren wird. Ich glaube ich hatte auch schon mal ein solches problem und weiß nicht mehr, wie ich's gelöst habe. Mein Vorschlag wäre: *.ncb, *.opt, *.clw -Dateien löschen und auch alle außer exe-Datei im Debugverzeichnis...

rgs
28.01.2007, 10:24
Hallo GrandInquisitor

Danke für Deine Antwort. Ich habe sie erst heute gesehen.

Also, das Löschen der Dateien war eine gute Idee, hat aber leider nichts gebracht. Hier mal der Code-Ausschnitt:

pNewActiveView = (CView*)new CMeinFormView;

CCreateContext context;
context.m_pCurrentDoc = pOldActiveView->GetDocument();

pNewActiveView->Create
( NULL, // Zeiger auf WNDCLASS-Struktur
NULL, // Name des Fensters
0L, // Window Style
CFrameWnd::rectDefault, // CRect für Position und Größe
this, // Zeiger auf "Parent-Window"
nView, // ID des neuen Fensters
&context // Zeiger auf den "create context"
};

/*
Nach diesem Aufruf passiert in einem funktionierenden Dialog folgendes:
Im Debugger wird der Inhalt von 'pNewActiveView' angezeigt als {CMeinFormView hWnd=???}

In dem fehlerhaften Dialog sieht es so aus:
Im Debugger wird der Inhalt von 'pNewActiveView' vor dem Funktionsaufruf
angezeigt als {CMeinFormView hWnd=???}
und nachher als {CView hWnd=0xfeeefeee}

Hier findet also eine Veränderung statt, die beim korrekt
arbeitenden Dialog nicht stattfindet.

Dieser Ablauf findet in jedem Fall in der selben Routine statt (= der selbe Code).
*/

/*
Der folgende Aufruf endet beim Problemdialog mit einer Access Violation 0xC0000005
*/
pNewActiveView->OnInitialUpdate();

Jetzt ist guter Rat teuer. Ich habe einen neuen, leeren Dialog ins Programm eingefügt, der mit dem alten, fehlerhaften Dialog nichts zu tun hat. Dieser funktioniert, wenn der Dialog-Stil auf 'untergeordnet' (WS_CHILD) eingestellt ist. Das ist aber bei dem fehlerhaften Dialog auch der Fall.

Die IDE läuft unter Windows XP SP2. Das ist aber schon eine ganze Weile so und hat bisher einwandfrei funktioniert. Könnte eventuell ein Windows Update für das Problem verantwortlich sein? Bei MS weiß man sowas ja nie.

TIA

GrandInquisitor
28.01.2007, 19:19
Dein Code sagt mir auch nicht viel jetzt, aber hast du dich bei den Klammern vertippt? Nämlich:

pNewActiveView->Create
(...
...
..
};

(...} <----- Das sieht etwas komisch aus.Geschweifte Klammer nach der normalen?

rgs
28.01.2007, 21:15
Hallo GrandInquisitor.

Mit den Klammern hast Du vermutlich recht - dürfte ein Tippfehler sein.

Die gute Nachricht: das Problem ist gelöst.

Der Fehler lag ganz wo anders - sollte man sich aber merken.
Irgend wie (weiß auch nicht wie) ist in den FormView-Dialog ein RichEdit-Control hinein geraten (vermutlich unachtsam rumgeklickt). Zu allem Übel war es noch durch ein anderes ziehmlich großes Control verdeckt, so dass es in der IDE nicht unmittelbar zu sehen war. Das hat den Absturz verursacht. Es gibt nämlich in der MS Knowledge Base einen Artikel, der besagt, dass ein Dialog-Template kein RichEdit-Control enthalten darf. Man kann das irgendwie mit einem Aufruf von 'AfxEnableControlContainer' umgehen, aber das hat bei mir nichts bewirkt. Die Funktion wird zwar in InitInstance aufgerufen, der Dialog ist aber trotzdem abgstürzt.

Da ich das Control eh nicht brauche, habe ich es gelöscht und alles war wieder paletti.

Ich danke Dir herzlich für Deine Unterstützung.

CU