Modaler Dialog
-
wegen der Autovariable, MFK meinte das so
anstattCCheckPassword *pChkPassword; pChkPassword = new CCheckPassword(this, m_strPW);
sollst du nur
CCheckPassword ChkPassword(this,m_strPW);
benutzen.
Und nicht einfach das delete weglassen.
-
Hallo,
es ist egal ob ich den Dialog als Zeiger oder direkt als -Autovariable- aufrufe....das Programm stürzt danach gleichermaßen ab.Trotzdem Danke für die Erklärung....! :p
Noch ne Idee vielleicht?!?
Gruss
S.
-
was genau heißt "im weiteren Verlauf"?
-
Hallo,
Danke für die Antworten.
Habe das Problem zwar immer noch nicht gelöst, allerdings kann ich es jetzt besser beschreiben.
Also, in der RELEASE - Version läuft das Programm korrekt und fehlerfrei.
In der DEBUG-Version stürzt das Prgramm in Bezug auf die wincore.cpp (Zeile 886) ab.
Hier mal der Auszug aus der wincore.cpp:#ifdef _DEBUG void CWnd::AssertValid() const { if (m_hWnd == NULL) return; // null (unattached) windows are valid // check for special wnd??? values ASSERT(HWND_TOP == NULL); // same as desktop if (m_hWnd == HWND_BOTTOM) ASSERT(this == &CWnd::wndBottom); else if (m_hWnd == HWND_TOPMOST) ASSERT(this == &CWnd::wndTopMost); else if (m_hWnd == HWND_NOTOPMOST) ASSERT(this == &CWnd::wndNoTopMost); else { // should be a normal window ASSERT(::IsWindow(m_hWnd)); <----- ABSTURZ // should also be in the permanent or temporary handle map CHandleMap* pMap = afxMapHWND(); ASSERT(pMap != NULL); .....
Kann jemand damit was anfangen?!?
Irgendwie handle-Verlust oder so?!? Ich habe keine Ahnung.Def Initialisierung der Dialogklasse erfolgt ohne Übergabeparameter mit dem Standardkonstruktor:
CCheckPassword *pChkPassword; pChkPassword = new CCheckPassword(); // Passwort überprüfen - Dlg anzeigen if (pChkPassword->DoModal() == IDOK) { ....... }
Danke schon mal im Voraus.
Gruss
S.
-
Wie ist der Name der Funktion in der du den Dialog aufrufst?
ggf. ist einfach die Position des Aufrufs daran schuld - manches das von der MFC generiert wird verträgt nicht jede Aktion.
-
Hallo,
die Initialisierung und der Aufruf des Dialoges erfolgen in einer Doc-Klasse.
Diese wurde von mir erstellt und dient dazu diverse Dialoge und deren Funktionen zu verwalten.Diesen modalen Dialog rufe ich auch schon Mal aus CMainFrame heraus auf....funktioniert einwandfrei.
Keine Ahnung warum es aus diesem Doc nicht funktioniert.
Ich hoffe ich habe Deine Frage zufriedenstellend beantwortet....!?!?Danke für Deine Hilfe.
Gruss
S.
-
Stefan H schrieb:
die Initialisierung und der Aufruf des Dialoges erfolgen in einer Doc-Klasse.
"In einer Klasse" passiert kein Aufruf, weil eine Klasse keinen Code hat. Vermutlich meinst du eine Methode dieser Klasse, aber irgendwie kriegst du es nicht hin, mal zu verraten, welche das ist, oder wann diese aufgerufen wird.
Wie sieht der Callstack (Aufrufliste) zum Zeitpunkt des Absturzes aus?
-
Hallo,
Du hast natürlich Recht, der Aufruf des Dialoges erfolgt in einer METHODE meiner Dokumentklasse.Zum Zeitpunkt des Absturzes steht folgendes in der Aufrufliste:
USER32! 77e038b6() <--------- hier erfolgt der Absturz NTDLL! 7789ff57() USER32! 77e039e5() USER32! 77e1542f() USER32! 77e10e5a() USER32! 77e01ef0() USER32! 77e0204c() USER32! 77e021af() USER32! 77e10f28() MFC42D! 5f438bf5() MFC42D! 5f434464() MFC42D! 5f435bee() CKonfigurationDlg::PreTranslateMessage(tagMSG * 0x00474900 {msg=0x00000100 wp=0x0000000d lp=0x001c0001}) line 744 CSaveConfig::PreTranslateMessage(tagMSG * 0x00474900 {msg=0x00000100 wp=0x0000000d lp=0x001c0001}) line 73 + 20 bytes MFC42D! 5f433018() MFC42D! 5f43b776() MFC42D! 5f43bbdd() MFC42D! 5f43b250() MFC42D! 5f43bf04() MFC42D! 5f435a3e() WinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00000000, char * 0x0013262b, int 1) line 30 WinMainCRTStartup() line 330 + 54 bytes KERNEL32! 77e81af6()
In einem Dialog wähle ich über Radio-Buttons das Ziel des Speichervorganges aus und starte den Speichervorgang über einen Button. In dieser Fkt wird dann die Methode SaveSettingsToAdma() des Dokuments aufgerufen.
// Settings in ADMA speichern bChkTransmission = m_pDoc->SaveSettingsToAdma();
Das Dokument wurde im Konstruktor des Dialoges mit this mitübergeben.
//----------------------------------------------------------------------------------------------- BOOL CKonfigurationDoc::SaveSettingsToAdma() //----------------------------------------------------------------------------------------------- { // lokale Variable für Statusmeldungen int status; // Daten konnten übermittelt werden? BOOL btransmissionOK = FALSE; // Dialog für Passwortabfrage einbinden CCheckPassword *pChkPassword; pChkPassword = new CCheckPassword(); // Passwort überprüfen - Dlg anzeigen if (pChkPassword->DoModal() == IDOK) { ........
In dieser Fkt erfolgt dann der Aufruf der Passwortabfrage.
Ich hoffe ich konnte Dir jetzt Deine Fragen beantworten....
ABer eigentlich geht dies ja noch alles gut....der Fehler tritt ja erst auf wenn meine Aufrufe alle abgearbeitet wurden und ich die "Disassemblierung" angezeigt bekomme.....!
Vielen Dank für Eure Hilfe.
Gruss
S.
-
Stefan H schrieb:
Zum Zeitpunkt des Absturzes steht folgendes in der Aufrufliste:
USER32! 77e038b6() <--------- hier erfolgt der Absturz ... [b]CKonfigurationDlg::PreTranslateMessage[/b](tagMSG * 0x00474900 {msg=0x00000100 wp=0x0000000d lp=0x001c0001}) line 744
Was passiert denn so in dieser Methode?
-
Hallo,
so sieht diese Funktion aus://----------------------------------------------------------------------------------------------- BOOL CKonfigurationDlg::PreTranslateMessage(MSG* pMsg) //----------------------------------------------------------------------------------------------- { if (pMsg->message>= WM_KEYFIRST && pMsg->message<= WM_KEYLAST) { return::TranslateAccelerator(m_hWnd,(HACCEL__*)m_hAccel, pMsg); } // Standard-Behandlung durchfuehren return CDialog::PreTranslateMessage(pMsg); }
Hier hole ich mir ein Handle auf meinen Accelerator. Das Problem lag wohl darin, dass ich den Maus-Tastendruck hier nicht abgefangen habe.
Danke für Deine ausdauernde Hilfe.
Gruss
S.