Fehler: "Access Violation"



  • ich kämpfe grad erfolglos gegen folgenden fehler:

    Nicht abgefangene Ausnahme in DP1.exe (MFC42D.DLL): 0xC0000005: Access Violation.<<

    kann mir jemand sagen, was sich genau hiter dieser meldung verbirgt, und mir evtl. ein paar tips geben wo ich den fehler suchen muss.

    zum hintergrund:
    ich habe eine funktionierende void (kein error):

    afx_msg void OnFunction();
    

    die ich aber auch via buttonclick von eiem anderen dialog aufrufen will:

    void CButtonDlg::OncmdButton() 
    {
    	CFunctionDlg *dlg;
    	dlg = (CFunctionDlg *) theApp.m_pMainWnd;
    	dlg->MyOnFunction();
    }
    

    in MyOnFunction steht dann:

    OnFunction();
    

    also wie gesagt, wenn ich von einem button in CButtonDlg OnFunction() aufrufe gehts, vom anderen dialog aus gehts nicht 😕

    *verzweifelt!
    hoffe jemand hat noch ne idee worans liegen könnt.



  • Dein Pointer ziegt sonnst wo hin, aber net dahin wo er hinzeigen soll 😉

    Hast du ne Dialog basierte Anwendung und die FUnktion ist in dem Hauptdialog?

    void CButtonDlg::OncmdButton(void) 
    {
        CFunctionDlg* pDlg = (CFunctionDlg*)AfxGetMainWnd();
        pDlg->MyOnFunction();
    }
    


  • Du greifst auf einen Speicherbereich (meistens eine Pointer Variable) zu, die keinen Inhalt besitzt.
    Debugge die Anwendung mittels des Debuggers mal durch. Da siehst du dann an welcher Stelle es knallt.
    Mehr zum Thema debuggen unter http://www.c-plusplus.net/forum/viewtopic-var-t-is-120832.html



  • der debuger ist mein freund!
    daher hab ich ja die fehlermeldung.

    ich habe folgendes:

    ..........................windowsplit
    ..........................|.................|
    ..............registerkarten.......registerkarten
    .................|...............................|
    ..............ButtonDlg.................FunctionDlg
    .................|................................|
    ...............Button.....................OnFunction & MyOnFunction

    mit dem buttonclick des buttons auf der linken seite soll über die funktion MyOnFunction OnFunktion ausgeführt werden (OnFunction ist ebenfalls einem Button auf FunktionDlg zugeordnet)

    soweit funktionert das auch: ich gelange über den click zu OnFunction
    dort bekomme ich dann den fehler.

    ich habe jetzt herausgefunden (glaub ich) dass alles mit einer variablen (bzw. hadle "m_hsource") zusammenhängt.

    dieser inhalt wird in OnFunktion abgefragt, und wurde zuvor in einer anderen funktion in FunktionDlg gesetzt.
    nach der "rückkehr" von

    void CButtonDlg::OncmdButton() 
    {
        CFunctionDlg *dlg;
        dlg = (CFunctionDlg *) theApp.m_pMainWnd;
        dlg->MyOnFunction();
    }
    

    in den dialog FunctionDlg (also zu MyOnFunction) ist der inhalt verändert/leer

    aber warum 😕 und wie bekomm ich das weg 😕



  • Ich fürchte, der Cast schlägt schon fehl.

    AfxGetMainWnd gibt dir das Hauptfenster. In dem Hauptfenster kommt aber erst noch der Split, dann die Karten und DANN erst das, was du haben willst.
    Da musst du dich noch durchhangeln. (Aber ich weiß gerade nicht, wie...)



  • hmmm?? versteh ich nicht!

    der link zu OnFunction klappt doch ich komm doch dort hin...

    nur das Handle m_hsource von FunctionDlg ist dann plötzlich leer



  • Bevor ich hier noch Murks erzähle...
    Hast du eine SDI, eine MDI oder eine Dialoganwendung?



  • MDI



  • theApp.m_pMainWnd wie oft soll man dir denn noch sagen das das Murks ist?



  • "murks" würd ich das nicht nennen, der Link zu OnFunction fuktioniert doch.

    dein vorschlag:

    void CButtonDlg::OncmdButton(void)
    {
        CFunctionDlg* pDlg = (CFunctionDlg*)AfxGetMainWnd();
        pDlg->MyOnFunction();
    }
    

    funktioniert auch genauso gut
    oder besser gesagt genauso schlecht.

    obwohl ich die variable (ein Handle)

    m_hsource
    

    nicht verändere ist der inhalt auf 0 zurückgesetzt. was beim aufruf aus dem gleichen dialog nicht passiert.
    wird hier irgend ein speicher überschrieben oder so???



  • Doch... das ist Murks... aber was solls... m_hSource ist also innerhalb der MyOnFunction 0? Oder wo? Wurde der Handle vorher irgendwie initialisiert?



  • sie wird in CFunktionDlg deklariert
    wenn ich sie public deklariere ist sie später 0
    wenn ich sie private deklariere bekomm ich den "Access Violation" fehler

    ich überwache die variable während des debugs im überwachungsfenster:
    - sobald ich auf den butten klicke kann ich den inhalt nicht mehr sehen (CXX0017)
    - wenn ich dann weiter laufen lass, bis ich wieder zurück in der datei von CFunctionDlg bin (also zb. bei MyOnFunction) ist plötzlich m_hSource = 0
    (ich kann jedoch keine zeile finden, die in der zwischenzeit augeführt wird und in der die variable verändert wird.

    so langsam wirds gespenstisch 😉

    (warum ist das murks? schlechter stiel? umständlich? )



  • private sollte sie sein... public kenn ich nicht 😉

    Setz nen Breakpoint in die Funktion die beim Buttonklick aufgerufen werden soll... geh dann mit hump over und jump in in die entsprechenden Funktionne rein und guck wie die Variablen sich verhalten... evt. benutzt du auch einfach eine nicht initialisierte Variable... wenn de VC hast, stell mal Warnings auf Level 4 ... dann wird dir soetwas auf JEDENFALL gemeldet... PS: Warning = (fast immer) Fehler... man sollte immer Versuchen selbst alle Warnungen rauszuhauen... das zahlt sich aus 😉



  • 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.


Anmelden zum Antworten