Fehler: "Access Violation"
-
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_hsourcenicht 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" fehlerich ü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 überCFunctionDlg* 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->MyOnFunctionoder?
-
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!