Nach Prozedurende erfolgt absturz
-
Ja, du hast recht ... Danke! ... weißt du wie dieser Dialogaufruf fehlerfrei gestaltet werden kann?
-
ich habe jetzt sd.OnOk(); weggelassen und dann funktioniert es natürlich. Danke für die Hilfe ich habe es nicht mehr gesehen...
-
Hab mich zu Früh gefreut, leider ist immer noch das gleiche Verhalten erkennbar, das Programm stürzt an der genannten Stelle ab und kehrt auch nicht aus DoModal() Aufruf zurück.
-
Also aufgerufen wird dein Dialog noch korrekt oder? Dann auf einen Klick auf den OK-Button stürzt es ab? Hast du an dem OK Button was verändert, also zB eine OnOK-Funktion direkt zum Dialog hinzugefügt die aufgerufen wird oder ist das noch der normale OK-Button der vom Assistent eingefügt wird?
-
Also ich kann mir nicht vortsllen, dass diese Fehler nbicht in der Debug Version zu einem ASSERT geführt haben...
Bekommst Du wirklich keinen ASSERT?
-
Ja der Dialog wird korrekt aufgerufen und nach der OnOK() Methode meiner SetData Klasse bleibt der Debugger mit der Fehlermeldung stehen:
Benuzerdefinierter Haltepunkt aus Quellcode aufgerufen bei 0x....
Noch mal zusammenfassend:
void CTestDoc::InsertZeichenDialog(){
SetData sd;
sd.DoModal();
-- diese Stelle erreicht mein Programm nicht mehr, es stürzt vorher ab!
}void SetData::OnOk(){
CDialog::OnOk();
}Prinzipieller Ablauf von dem ich ausgehe:
Mit einem angelegtem Objekt… .doModal(); aufrufen, dies öffnet den Dialog.
Wenn nun dieser Dialog mit einem Klick auf den OK Button beendet wird, dann befindet sich das Programm in der OnOK() Methode. Der Aufruf CDialog::OnOK(); in der OnOK() Methode schließt dann den Dialog wieder und der Programmablauf geht nach doModal() weiter.
-
Ich habe jetzt noch mal in der SetData Klasse nach vorhandenen Störquellen gesucht und dabei ist mir diePostNcDestroy() Methode die mein Vorgänger eingefügt hat aufgefallen, ich hab sie daraufhin auskommentiert und nun stüzt mein Programm nicht mehr ab. Es funktioniert jetzt, aber ich kann den Zusammenhang nicht nachvollziehen???
Was ich momentan weiß ist, dass er nach dem beenden der OnOk() Methode in die PostNcDestroy() hineinsteigt.
-
PostNcDestroy wird automatisch aufgerufen, nachdem das Fenster bzw. der Dialog eine WM_NCDESTROY-Nachricht erhalten hat. Was wurde denn in PostNcDestroy noch gemacht?
-
Es wurde bloß "delete this" und "CDialog::PostNCDestroy()" aufgerufen und deshalb ist mir beim Compilieren das Programm danach abgestürzt.
-
Mit
delete this;wird das Dialogobjekt nach dem Schließen des Fensters automatisch gelöscht. Das funktioniert aber nur bei dynamisch erstellten Dialogen mit
CMyDialog* pDialog = new CMyDialog;Bei auf dem Stack erzeugten Dialogen (wie bei Dir) endet es aber ganz böse, weil es hier nichts zu löschen gibt. Das Ergebnis ist dann eine Zugriffsverletzung.