Fehler: "Access Violation"



  • Wenn du eine MDI hast, dann ist dein Hauptfenster nie und nimmer ein CDialog. 😮
    Schau mal da rein: http://www.codeguru.com/forum/showthread.php?t=281430
    Das meinte ich mit durchhangeln.

    Das Problem am C-Cast

    CFunctionDlg* pDlg = (CFunctionDlg*)AfxGetMainWnd();
    

    ist, dass er IMMER funktioniert, auch wenn er gar nicht funktionieren kann. 😉
    Du hast immer einen gültigen Zeiger - so murksig der sein mag, du merkst es nicht.

    Deswegen arbeite ich mit dynamic_cast, der gibt NULL zurück, wenn es nicht funktioniert hat. 👍

    Bau den mal testweise ein (kann sein dass du RTTI einschalten musst) und guck, ob dein Zeiger okay ist.



  • Hmmm... stimmt... da hab ich garnet drauf geachtet... dann ist aber auch theApp.m_hMainWnd schwachsin 😃



  • Wenn du eine MDI hast, dann ist dein Hauptfenster nie und nimmer ein CDialog.

    hab ich auch nie behauptet.

    ich habe ein MainFrm, dann kommt ein WndSplit(rechts, links), auf jeder seite ist ein TabCtrl(mit mehreren Seiten), und jede Seite besteht natürlich aus einem CDialog. (weiter oben hab ich das schonmal versucht zu skizzieren)

    der button befindet sich auf einem dialog in der linken seite, die funktion mit der er verknüpft werden soll befindet sich auf einem dialog auf der rechten seite.

    nochmal das problem:
    der button ist mit der funktion über

    CFunctionDlg* pDlg = (CFunctionDlg*)AfxGetMainWnd();
        pDlg->MyOnFunction();
    

    verknüpft, was auch funktioniert (habs mit stopps im debuger getestet) er springt nach dem buttonclick(linke seite) zu der funktion in dem anderen Dialog(rechte seite).

    nur habe ich zuvor eine variable des dialogs (rechte seite) gesetzt.
    und der inhalt ist nachdem ausführen dieser beiden zeilen "weg"

    CFunctionDlg* pDlg = (CFunctionDlg*)AfxGetMainWnd();
        pDlg->MyOnFunction();
    

    ich habe die variable schon im debuger beobachtet, kann aber nichts finden was sie verändert, wie gesagt, nach diesen beiden zeilen ist sie plötzlich weg.

    also ich werde mal dynamic_cast probieren...
    was ist RTTI?



  • ach ja: warnings-Stufe 4 = keine meldungen (scheint alles ok zu sein)



  • Tjo... AfxGetMainWnd gibt dir aber nen Handle auf das MainFrame... nicht aber auf einen deiner Dialoge...



  • aha!



  • wenn ich das richtig verstanden hab, heißt das, ich brauche jetzt noch in MainFrm ein handle auf meinen dialog?
    und muss meine funktion dann ungefähr so aufrufen:
    dlg->functiondlg->MyOnFunction

    oder?



  • Joa, sieht gut aus. Versuch mal. 🙂

    Ich finde es erstaunlich, dass das mit dem Button funktioniert hat - gibt schon interessante Phänomene. 😉
    RTTI heißt RunTime Type Information. Damit erkennt dein Programm zur Laufzeit, ob der Cast funktioniert hat oder ob du versuchst, aus Schuhen Äpfel zu casten.



  • ich glaube so langsam beginne ich zu verstehen ^^

    CFunctionDlg* pDlg = (CFunctionDlg*)AfxGetMainWnd();
    

    ist scheinbar auch "murks", denn wenn ichs richtig verstehe bekomme ich damit einen pointer auf mein MainFrame aber mit dem falschen typ (nähmlich CFunctionDlg).
    somit stehen mir anschließend unter pDlg zwar die funktionen von CFunctionDlg zur verfügung, obwohl ich mich eigentlich im CMainFrame befinde... ??? oder???

    müßte also dann so aussehen:

    CMainFrame* pFrm = (CMainFrame*)AfxGetMainWnd();
    

    ich vermute, dass die zuweisung eines hWnd-wertes im Debuger (z.b für pFrm {CMainFrame hWnd=0x00140430}) ein indiz dafür ist dass das geklappt hat ???

    weiter mit

    CDevTab* pTab = (CDevTab*)pFrm->m_wndSplitterL.GetPane(0,1);
    

    solte ich an mein linkes Pane des Splitters kommen können (ebenfals hWnd=0x00...)

    und wo ich schon mal so in fahrt war hab ich gedacht ich kann so weitermachen um an meinen dialog zu kommen, der sich ja auf einem TabCrtl in diesem Pane befindet, doch

    CFunctionDlg* pDlg = (CFunctionDlg*)pTab->m_TabCtrl.GetItem(1);
    

    bringt mir den Fehler:

    "C2228: Der linke Teil von '.GetItem' muss eine Klasse/Struktur/Union sein"

    (include ist vorhanden, keine schreibfehler)
    der dialog wird so in das TabCtrl eingebunden.

    void CDevTab::CreatePages()
    {
    	CDialog*	dlg;
    	dlg = new CFunctionDlg;
    	ASSERT(dlg);
    	m_DlgArray.Add(dlg);
    	VERIFY(dlg->Create(IDD_FUNCTION_DIALOG, m_TabCtrl));
    ...
    

    könnt ihr mir helfen?
    kennt sich jemand damit aus?
    irgendwelche tipps?

    danke schon mal - danke auch an alle die mir bis jetzt so geduldig geholfen haben.



  • BINGO! ich habs!

    hab bei der erstellung der Tabs ein pointer-array auf die einzelnen dialoge angelegt, über dass ich dann wieder auf den dialog zugreifen kann:

    also nochmal für alle zum nachlesen:

    //pointer auf Hauptfenster
    CMainFrame* pFrm = (CMainFrame*)AfxGetMainWnd();   
    
    //pointer auf WndSplit-Pane
    CDevTab* pTab = (CDevTab*)pFrm->m_wndSplitterL.GetPane(0,1);   
    
    //pointer auf pointer-array auf dialoge des TabCtrl
    CFunctionDlg* pDlg = (CFunctionDlg*)pTab->TabDlg[0];
    
    //aufrufen der Funktion
    pDlg->MyOnFunction();
    

    nochmal VIELEN DANK an ALLE für die vielen tipps.



  • Hihihiihihihihi 😃 😉 Hast de das selber dir ausgedacht, oder nur aus dem anderen Thread hier, wo ich einen sehr ähnlcihen, ein wenig komplizierteren Lösungsvorschlag gegeben hab, kopiert?

    Naja... was solls... mach aber noch ne Fehlerüberprüfung rein!



  • nee, habs selber hingefriemelt. hat auch ne ganze weile gedauert. von dem anderen thread hättst mir ruhig früher erzählen können. 🙂

    was meinst du mit fehlerüberprüfung? ne simple if abfrage ob die pointer gesetzt sind?


Anmelden zum Antworten