Access Violation bei CListCtrl::Create

T

the_alien

Hi.

Erstmal ein "Hi ihr" in die Runde werfen, dies ist mein erster Post in eurem Board :)

Nun zu meinem Problem:
Ich will ein CListCtrl Element erstellen:
Code:
	CWnd* pWnd = this;
	m_ListCtrl->Create(WS_VISIBLE|WS_BORDER,rect,pWnd, 1);
Wenn der Aufruf getätigt wird kiege ich eine Exception:
First-chance exception in emp3cut.exe: 0xC0000005: Access Violation.

Ich schätze, dass es daran liegt, dass der Aufruf in der MFC
Code:
BOOL CListCtrl::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd,
	UINT nID)
{
	// initialize common controls
	VERIFY(AfxDeferRegisterClass(AFX_WNDCOMMCTL_LISTVIEW_REG));

	CWnd* pWnd = this;
	return pWnd->Create(WC_LISTVIEW, NULL, dwStyle, rect, pParentWnd, nID);
}
Für pWnd keinen gültigen Pointer zurückliefert. Um genau zu sein ist pWnd immer "0xcccccccc".

Aber wie kann das passieren?

Ich rufe mein CListCtrl::Create in OnInitDialog auf. Aber das gleiche Problem habe ich, wenn ich das in OnPaint aufrufe.

Ich weiss echt nicht weiter. Ich hoffe doch, dass ich genug Infos gegeben habe und ihr mir weiterhelfen könnt.

Danke schonmal
--alien
 
Warum setzt du die das Ding nicht via Ressourceneditor und Classwizard rein? Dann brauchst du nicht von Hand createn. Aber vielleicht hast du ja einen bestimmten Grund dafür. m_ListCtrl scheint nur ein Pointer zu sein - hast du überhaupt ein CListCtrl mit new alloziert? Übrigens ist es meist einfacher und sinnvoller, nicht den Pointer auf ein Control als Member zu verwenden, sondern das Control direkt. Also:

Code:
CMeinDialog
{
  // ...  
  
  CListCtrl m_ctlMeineListe;
  // anstelle von
  // CListCtrl* m_pMeineListe;

  // ...
};
 
Also ich tippe auf 2 Möglichkeiten:

1.)
siehe Post von Kachelator, eventuell rufst du auf eien ungülten Zeiger die Create Funktion, prüf das mal bitte nach, ob du auch ein Objekt erstellst, auf das dann dein Zeiger zeigt:
Code:
CListCtrl *m_ListCtrl;
.
.
.
m_ListCtrl = new CListCtrl();

m_ListCtrl->Create(...)

2.)

Dein this Zeiger hat ne "macke" also ist zu dem Zeipunkt ungültig:
Code:
CWnd* pWnd = this;
m_ListCtrl->Create(WS_VISIBLE|WS_BORDER,rect,pWnd, 1);
und somit ist pWnd ein ungültiges Elternfenster.
Wenn ich mich recht erinnere, ist OnInitDialog da etwas zu früh, da der Dialog zu diesem Zeitpunkt noch kein Fenster hat. (kann mich aber auch täuschen).

Gruß Homer
 
Wenn ich mich recht erinnere, ist OnInitDialog da etwas zu früh, da der Dialog zu diesem Zeitpunkt noch kein Fenster hat.
In OnInitDialog ist normalerweise schon alles fertig created und funktionstüchtig -- nur der Dialog wird noch nicht angezeigt.
 
In OnInitDialog ist normalerweise schon alles fertig created und funktionstüchtig -- nur der Dialog wird noch nicht angezeigt.
Tja ich kann mich nur wage erinnern, genau diesbezüglich auch schon mit Abstürzen gekämpft zu haben. Naja, evtl. war es ja in einem anderen Zusammenhang.
Aber wie schon gesagt, MFC und ich wir mögen uns nicht so besonders :-(
Kämpf selbst gerade oft genug mit dieser dummen MFC rum.

Gruß Homer
 
Access violation

Hi,

kann es daran liegen das bei C++ der Dialog erst nach der Funktion DoModal() zugriffsberechtigt existiert? Dann ist der Grund fuer die Zugriffsverletzung der noch nicht existierende Dialog da OnInitDialog vor DoModal() ausgefuehrt wird.

Pizza
 
das bei C++ der Dialog erst nach der Funktion DoModal() zugriffsberechtigt existiert?
Wenn ein Dialog mit DoModal() geöffnet wird, steht alles andere in der Anwendung ausser diesem Dialog, bis er geschlossen wird. Deshalb auch "modal". Nach DoModal() ist er garantiert nicht mehr da.
Dann ist der Grund fuer die Zugriffsverletzung der noch nicht existierende Dialog da OnInitDialog vor DoModal() ausgefuehrt wird.
Nee, DoModal() ruft alles auf, was zum Öffnen des Dialoges nötig ist -- unter anderem auch das OnInitDialog() des Dialoges. Deshalb kann man nicht davon sprechen, das OnInitDialog() vor DoModal() aufgerfuen wird.
 
Hmmm, da OnInitDialog aufgerufen wird, muss der Dialog zumindest in den Anfängen da sein. Was ich mir noch vorstellen könnte, ist, dass der Dialog während des OnInitDialog, aber noch vor dem ListCtrl::Create durch irgendetwas schon wieder zerstört wird. Das müsste aber dann schon vom User kommen.

Ist auf dem Dialog evtl. ein OCX oder ActiveX-Control drauf? Ich weiss, dass Windows dann beginnt, das Fenster zu erstellen, das Ganze aber dann wieder platt macht, weil es unter Umständen das OCX nicht erzeugt bekommt. Ich bin mir aber nicht sicher, ob das nicht schon in WM_CREATE bzw. OnCreate passiert.

Zeig mal den Code, wie dein m_ListCtrl definiert ist (vermutlich CListCtrl*) und wo und wie es ge-new-t wird.
 
Zurück