Modaler Dialog



  • Danke für die Antwort.
    Da ich auch dachte das es an den Übergabeparametern liegt habe ich das ganze jetzt mal umgestrickt OHNE Übergabeparameter.
    Funktioniert trotzdem nicht....also kann man das schon mal ausschließen.

    Ja, ich habe den Rest der Fkt verschwiegen....habe aber auch diesen schon auskommentiert und der Fehler kommt trotzdem.
    Das Öffnen und Schließen des Dialogs erfolgt ohne Probleme....habe den weiteren Verlauf so weit verfolgt (Debug) bis zur "Disassemblierung".....und da stürzt er dann wie gesagt ab.

    Autovariable?!? Da ich dieses Objekt ja in der Fkt erzeuge wird es eigentlich doch sowieso beim Verlassen zerstört, oder? Also kann ich das delete auch getrost weglassen..... 😕
    Hat allerdings auch nichts gebracht.

    Weiß nicht wie ich mein Problem noch detaillierter beschreiben könnte....

    Trotzdem Danke für alle Tipps.

    Gruss
    S.



  • wegen der Autovariable, MFK meinte das so
    anstatt

    CCheckPassword    *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.


Anmelden zum Antworten