Filou Geschrieben 27. Februar 2006 Geschrieben 27. Februar 2006 Ein verzweifeltes helau! Ich habe ein Listenelement (CListCtrl) in einen Dialog eingebunden und füllle diese Liste aus einer Datenbank (CDaoRecordSet). Das füllen der Liste funktioniert ohne Probleme. Beim Anklicken der Einzelnen Einträge soll die Funktion "OnListedbClick" gestartet werden. Das funktioniert aber nur beim ersten Datensatz. Sobald ich die Liste mit anderen Daten fülle und dann doppelt anklicke, bekomme ich die Fehlermeldung:Nicht abgefangene Ausnahme in Test.exe (KERNEL32.DLL): 0xE06D7363: Microsoft C++ Exception. Die Meldung sehe ich in der Ausgabe vom Visual Studio. Woran kann das liegen? Werde einfach nicht schlau daraus :( Zitieren
Klotzkopp Geschrieben 27. Februar 2006 Geschrieben 27. Februar 2006 Hält das Programm danach an, oder läuft es weiter? Funktioniert es ansonsten? Welche Version von VS? Zitieren
Filou Geschrieben 27. Februar 2006 Autor Geschrieben 27. Februar 2006 Danke für Deine Antwort!! Das Programm läuft weiter. Nur im Debug-Modus sieht man die Meldung. Und ich habe das VS 6. Die Funktion "OnListedbClick" habe ich mit dem Klassen-Assistent angelegt. Zitieren
Filou Geschrieben 27. Februar 2006 Autor Geschrieben 27. Februar 2006 Mal ein bissel Code. Das ist die Funktion die das Dokument öffnen soll. Aber soweit kommt es ja gar nicht, dass diese Funktion aufgerufen wird (zumindest beim 2ten Datensatz nicht: ///////////////////////////////////////////////////////////////////////////// // Dokument bei Doppelklick öffnen. void CPatient::OnListedbClick(NMHDR* pNMHDR, LRESULT* pResult) { // NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; CString csFile; m_DBDokumente.m_Pfad; CString csAlterPfad; CString csBuffer; CString csBuffer2; CString csNeuerPfad; char chBuffer; int iCount = 0; //Ändert das einfache \ in dem Pfad in ein \\ csAlterPfad = m_DBDokumente.m_Pfad; while(iCount < csAlterPfad.GetLength()) { chBuffer = csAlterPfad.GetAt(iCount); int i = csAlterPfad.GetLength(); if (chBuffer == '\\') { csBuffer2 = "\\"; } else { csBuffer2 = ""; } iCount++; csBuffer = chBuffer; csNeuerPfad = csNeuerPfad + csBuffer + csBuffer2; } csFile = m_ctrlList.GetItemText(m_ctrlList.GetSelectionMark() ,0); ShellExecute( NULL, "open", csNeuerPfad + csFile, NULL, NULL, SW_NORMAL ); ..... Hier wird zu dem aktuellen Patienten die Dokumente gesucht und in die Liste geschrieben. Das CListCtrl wird sonst an keiner stelle mehr berührt: ///////////////////////////////////////////////////////////////////////////// // Dokumente zu Patient suchen bool CPatient::DokumenteSuchen(int iPatNr, CString csDokTyp) { bool bCheck = FALSE; int iCount = 0; int iCount2 = 0; m_DBDokumente.MoveFirst(); while (iCount <= m_DBDokumente.GetRecordCount()) { if(m_DBDokumente.m_PatNr == iPatNr && m_DBDokumente.m_Typ == csDokTyp) { bCheck = TRUE; iCount++; // Eintrag hinzufügen m_ctrlList.InsertItem(iCount2,m_DBDokumente.m_DokIDName,NULL); //Prüfen ob aktueller eintarg = letzer eintrag in Tabelle if (iCount == m_DBDokumente.GetRecordCount()) { break; } m_DBDokumente.MoveNext(); iCount2++; } else { //Prüfen ob aktueller eintarg = letzer eintrag in Tabelle if (iCount == m_DBDokumente.GetRecordCount()) { break; } m_DBDokumente.MoveNext(); iCount++; } } if (bCheck == FALSE) { MessageBox("Es wurde noch kein Dokument dieses Typs zu diesem Patienten hinzugefügt.\nÖffnen Sie den Importassistent zum Hinzufügen neuer Dokumente.","Patientendaten - Dokumente nicht verfügbar",MB_ICONINFORMATION); } else { return TRUE; } return FALSE; Zitieren
Klotzkopp Geschrieben 27. Februar 2006 Geschrieben 27. Februar 2006 Diese Backslashverdopplung ist IMHO unnötig. Doppelte Backslashes brauchst du nur bei Stringliteralen im Quellcode und ein paar sehr seltenen Sonderfällen. Bei ShellExecute brauchst du sie sicher nicht. Wenn das Programm weiterläuft, war das eine sogenannte First chance exception. Es trat also eine Ausnahme auf, es gibt aber einen Exception Handler dafür (z.B. einen try-Block). Nur wenn der die Ausnahme nicht behandelt, würde der Debugger das Programm anhalten. Das muss nicht unbedingt ein Fehler sein. Wenn du dem auf den Grund gehen willst, kannst du unter Debug -> Exceptions (IIRC) einstellen, dass VC bei dieser Art Ausnahme (0xE06D7363) immer anhält. Dann kannst du über den Callstack sehen, wo der Aufruf herkam. Du könntest auch deinen Code mit Traces spicken, um grob abschätzen zu können, wo die Exception herkommt. Aber die erste Methode ist die bessere. Zitieren
Filou Geschrieben 28. Februar 2006 Autor Geschrieben 28. Februar 2006 Ich Danke Dir!! Ich habe es jetzt so eingestellt und es hält auch an. Und Zwar in der Disassemblierung unter "7C81EB33 pop esi". In der Aufrufliste unter: "KERNEL32! 7c81eb33()" Wie hilft mir das jetzt weiter? Davon hab ich nicht so viel Ahnung.... Zitieren
Klotzkopp Geschrieben 28. Februar 2006 Geschrieben 28. Februar 2006 Lass dir den Callstack (Aufrufliste) anzeigen. Dann kannst du sehen, wo der Aufruf herkam. Zitieren
Filou Geschrieben 28. Februar 2006 Autor Geschrieben 28. Februar 2006 Lass dir den Callstack (Aufrufliste) anzeigen. Dann kannst du sehen, wo der Aufruf herkam. Wie meinst Du das? Wie gesagt, in der Aufrufliste steht "KERNEL32! 7c81eb33()". Ich kann mit der rechten Maustaste draufklicken und im Kontextmenü auf "Quellcode anzeigen". aber da passiert nichts. Alles aus der Aufrufliste: KERNEL32! 7c81eb33() MPSHHOOK! 5f80c086() MPSHHOOK! 5f80b669() MPSHHOOK! 5f8098d2() MPSHHOOK! 5f8099ff() MPSHHOOK! 5f809b08() SHELL32! 7ca5a63b() SHELL32! 7ca12c4b() SHELL32! 7ca12b02() SHELL32! 7ca118e6() SHELL32! 7ca1185e() SHELL32! 7ca117fa() SHELL32! 7ca50c62() SHELL32! 7ca50ee9() CLabel::OnLButtonDown(unsigned int 1, CPoint {x=49 y=11}) line 250 + 30 bytes CWnd::OnWndMsg(unsigned int 513, unsigned int 1, long 720945, long * 0x0012e898) line 1975 CWnd::WindowProc(unsigned int 513, unsigned int 1, long 720945) line 1596 + 30 bytes AfxCallWndProc(CWnd * 0x0012f350 {CLabel hWnd=0x00040718}, HWND__ * 0x00040718, unsigned int 513, unsigned int 1, long 720945) line 215 + 26 bytes AfxWndProc(HWND__ * 0x00040718, unsigned int 513, unsigned int 1, long 720945) line 379 AfxWndProcBase(HWND__ * 0x00040718, unsigned int 513, unsigned int 1, long 720945) line 220 + 21 bytes USER32! 77d18734() USER32! 77d18816() USER32! 77d189cd() USER32! 77d18a10() USER32! 77d2e097() USER32! 77d3c6ab() CWnd::IsDialogMessageA(tagMSG * 0x00424c68 {msg=0x00000201 wp=0x00000001 lp=0x000b0031}) line 182 CWnd::PreTranslateInput(tagMSG * 0x00424c68 {msg=0x00000201 wp=0x00000001 lp=0x000b0031}) line 3435 CDialog::PreTranslateMessage(tagMSG * 0x00424c68 {msg=0x00000201 wp=0x00000001 lp=0x000b0031}) line 92 CWnd::WalkPreTranslateTree(HWND__ * 0x00060672, tagMSG * 0x00424c68 {msg=0x00000201 wp=0x00000001 lp=0x000b0031}) line 2678 + 18 bytes CWinThread::PreTranslateMessage(tagMSG * 0x00424c68 {msg=0x00000201 wp=0x00000001 lp=0x000b0031}) line 672 + 18 bytes CWinThread::PumpMessage() line 848 + 30 bytes CWnd::RunModalLoop(unsigned long 4) line 3489 + 19 bytes CDialog::DoModal() line 539 + 12 bytes CLogIn::OnOK() line 223 _AfxDispatchCmdMsg(CCmdTarget * 0x0012fd20 {CLogIn hWnd=0x00060672}, unsigned int 1, int 0, void (void)* 0x5f402a00 `vcall'(void), void * 0x00000000, unsigned int 12, AFX_CMDHANDLERINFO * 0x00000000) line 88 CCmdTarget::OnCmdMsg(unsigned int 1, int 0, void * 0x00000000, AFX_CMDHANDLERINFO * 0x00000000) line 302 + 39 bytes CDialog::OnCmdMsg(unsigned int 1, int 0, void * 0x00000000, AFX_CMDHANDLERINFO * 0x00000000) line 97 + 24 bytes CWnd::OnCommand(unsigned int 1, long 263742) line 2099 CWnd::OnWndMsg(unsigned int 273, unsigned int 1, long 263742, long * 0x0012f794) line 1608 + 28 bytes CWnd::WindowProc(unsigned int 273, unsigned int 1, long 263742) line 1596 + 30 bytes AfxCallWndProc(CWnd * 0x0012fd20 {CLogIn hWnd=0x00060672}, HWND__ * 0x00060672, unsigned int 273, unsigned int 1, long 263742) line 215 + 26 bytes AfxWndProc(HWND__ * 0x00060672, unsigned int 273, unsigned int 1, long 263742) line 379 AfxWndProcBase(HWND__ * 0x00060672, unsigned int 273, unsigned int 1, long 263742) line 220 + 21 bytes USER32! 77d18734() USER32! 77d18816() USER32! 77d1b89b() USER32! 77d1b903() COMCTL32! 773c6ff6() COMCTL32! 773c70d8() COMCTL32! 773c93dd() USER32! 77d18734() USER32! 77d18816() USER32! 77d189cd() USER32! 77d18a10() USER32! 77d2e097() USER32! 77d3c6ab() CWnd::IsDialogMessageA(tagMSG * 0x00424c68 {msg=0x00000201 wp=0x00000001 lp=0x000b0031}) line 182 CWnd::PreTranslateInput(tagMSG * 0x00424c68 {msg=0x00000201 wp=0x00000001 lp=0x000b0031}) line 3435 CDialog::PreTranslateMessage(tagMSG * 0x00424c68 {msg=0x00000201 wp=0x00000001 lp=0x000b0031}) line 92 CWnd::WalkPreTranslateTree(HWND__ * 0x00060672, tagMSG * 0x00424c68 {msg=0x00000201 wp=0x00000001 lp=0x000b0031}) line 2678 + 18 bytes CWinThread::PreTranslateMessage(tagMSG * 0x00424c68 {msg=0x00000201 wp=0x00000001 lp=0x000b0031}) line 672 + 18 bytes CWinThread::PumpMessage() line 848 + 30 bytes CWnd::RunModalLoop(unsigned long 4) line 3489 + 19 bytes CDialog::DoModal() line 539 + 12 bytes CPsyProApp::InitInstance() line 81 + 11 bytes AfxWinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00000000, char * 0x00151f17, int 1) line 39 + 11 bytes WinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00000000, char * 0x00151f17, int 1) line 30 WinMainCRTStartup() line 330 + 54 bytes KERNEL32! 7c816d4f() Zitieren
Guybrush Threepwood Geschrieben 28. Februar 2006 Geschrieben 28. Februar 2006 Also ich hätte einfach mal nen Haltepunkt in die Funktion gesetzt die aufgerufen wird wenn du nen Doppelklick machst und dann geguckt wo genau die Exception auftritt... Zitieren
Filou Geschrieben 28. Februar 2006 Autor Geschrieben 28. Februar 2006 Also ich hätte einfach mal nen Haltepunkt in die Funktion gesetzt die aufgerufen wird wenn du nen Doppelklick machst und dann geguckt wo genau die Exception auftritt... Das Problem ist, dass die Funktion "OnListedbClick" ja gar nicht aufgerufen wird. Das ist ja eine MFC Klasse und ich weiß ja nicht wie das CListCtrl aufgebaut ist. Es wird wohl irgendwie die Maustaste abfangen und gucken auf welche Spalte geklickt wurde und dann in die Funktion springen. Aber wie MS das genau gemacht hat, weiß ich doch net. Zitieren
Filou Geschrieben 28. Februar 2006 Autor Geschrieben 28. Februar 2006 PS: Jetzt wo die Exeption abgefangen wird habe ich festgestellt, dass das Problem selbst beim bloßen Aufrufen des Dialogs auftritt. Ohne dass ich irgendwas geklickt hätte. Zitieren
Filou Geschrieben 28. Februar 2006 Autor Geschrieben 28. Februar 2006 Ich glaube immer mehr, dass es gar nicht an diesem Listenelement liegt. Vielleicht sind es 2 probleme. Ich habe das Steuerelement gelöscht und einen haltenpunkt in OnInitDialog() an obersten stelle gesetzt. Nichtmal da kommt es an. Der Fehler tritt vorher auf. Was nun? :-( Zitieren
Guybrush Threepwood Geschrieben 28. Februar 2006 Geschrieben 28. Februar 2006 Was hast du sonst noch so auf deinem Dialog drauf? Machst du noch irgendwas in PreCreateDialog oder so? Zitieren
Filou Geschrieben 28. Februar 2006 Autor Geschrieben 28. Februar 2006 Nein! Ich habe eben eine Kopie meines programms gemacht und darin mal alles raus gelöscht. Habe jetzt einen leeren Dialog ohne Funktionen und selbst da passiert es noch. Weiß net mehr weiter Zitieren
Guybrush Threepwood Geschrieben 28. Februar 2006 Geschrieben 28. Februar 2006 Vielleicht irgendwo malwas rausgelöscht was der Assistent erstellt hat und was irgendwie benötigt wird? Zitieren
Filou Geschrieben 28. Februar 2006 Autor Geschrieben 28. Februar 2006 Nein hab ich nicht. aber vielleicht ist es normal das dieser Fehler auftritt. Immerhin hätte er es ja nicht gemeldet wenn ich es nicht in die Exeptions eingetragen hätte. Vielleicht hat das gar nix mit meinem Steuerelemt Probelm zu tun. hab gesehen das es nämlich auch in anderen Dialogen auftritt. Zitieren
Klotzkopp Geschrieben 28. Februar 2006 Geschrieben 28. Februar 2006 Erstellst du deinen "Hauptdialog" in CLogIn::OnOK? Falls ja, nimm das bitte mal da raus und stell es hinter den Aufruf von DoModal der CLogIn-Instanz, das sollte in CPsyProApp::InitInstance passieren. Zitieren
Guybrush Threepwood Geschrieben 28. Februar 2006 Geschrieben 28. Februar 2006 Nein hab ich nicht. aber vielleicht ist es normal das dieser Fehler auftritt. Immerhin hätte er es ja nicht gemeldet wenn ich es nicht in die Exeptions eingetragen hätte. Vielleicht hat das gar nix mit meinem Steuerelemt Probelm zu tun. hab gesehen das es nämlich auch in anderen Dialogen auftritt. Es ist niemals normal das ein Fehler auftritt und auch niemals ok Zitieren
Filou Geschrieben 28. Februar 2006 Autor Geschrieben 28. Februar 2006 Erstellst du deinen "Hauptdialog" in CLogIn::OnOK? Falls ja, nimm das bitte mal da raus und stell es hinter den Aufruf von DoModal der CLogIn-Instanz, das sollte in CPsyProApp::InitInstance passieren. Ähm, ja das ist schon so. Die CLogin ist ein Anmeldedialog. Man klickt auf Anmelden und der Hauptdialog wird geöffnet. Soll ich jetzt das " CMainDlg Main; Main.DoModal();" in die Funktion "CPsyProApp::CPsyProApp()" kopieren? Dann wird es doch nicht mehr geöffnet wenn ich den "Anmelden" Button drücke. Glaub ich habe nicht ganz verstanden was Du meinst. *schäm* Zitieren
Klotzkopp Geschrieben 28. Februar 2006 Geschrieben 28. Februar 2006 Soll ich jetzt das " CMainDlg Main; Main.DoModal();" in die Funktion "CPsyProApp::CPsyProApp()" kopieren? Nein, in CPsyProApp::InitInstance. Dein Design ist, sagen wir, ungewöhnlich. Dein Login-Dialog "besitzt" deinen Hauptdialog. Die Hauptdialoginstanz "lebt" in einer Methode deiner Logindialogklasse. Eigentlich sollte der Logindialog dem Hauptdialog vorgeschaltet sein. Der Logindialog kann über EndDialog oder eine Membervariable dem Aufrufer von DoModal signalisieren, ob das Login erfolgreich war. Möglich wäre auch, dass der Logindialog gar nicht selbst prüft, sondern nur die Logindaten entgegen nimmt. Prüfen kann dann der Aufrufer des Logindialogs. Es ist übrigens ziemlich wahrscheinlich, dass das alles nichts mit deinem Fehler zu tun hat Zitieren
Guybrush Threepwood Geschrieben 28. Februar 2006 Geschrieben 28. Februar 2006 Also nach dem Beispiel in diesem Artikel: http://www.codeproject.com/cpp/exception.asp könnte das an nem uninitialisiertem Pointer liegen... Zitieren
Filou Geschrieben 28. Februar 2006 Autor Geschrieben 28. Februar 2006 Nein, in CPsyProApp::InitInstance. Dein Design ist, sagen wir, ungewöhnlich. Dein Login-Dialog "besitzt" deinen Hauptdialog. Die Hauptdialoginstanz "lebt" in einer Methode deiner Logindialogklasse. Eigentlich sollte der Logindialog dem Hauptdialog vorgeschaltet sein. Der Logindialog kann über EndDialog oder eine Membervariable dem Aufrufer von DoModal signalisieren, ob das Login erfolgreich war. Möglich wäre auch, dass der Logindialog gar nicht selbst prüft, sondern nur die Logindaten entgegen nimmt. Prüfen kann dann der Aufrufer des Logindialogs. Ich bin nicht so der Hauptberufliche Programmierer. Ich hab das auch nicht gelernt sonder mir selber beigebracht. Daher vermutlich die Designfehler. Es ist übrigens ziemlich wahrscheinlich, dass das alles nichts mit deinem Fehler zu tun hat Ich bin schwer beeindruckt wie Du dasalles an einem bissel Text in der Ausgabe sehen konntest. Echt nicht schlecht!! Ich dachte mir schon dass das nix mit meinem Probelm zu tun hat. Mein ursprünglicher Fehler war ja der, dass beim doppelklick auf das Steuerelement nicht die richtige Funktion aufgerufen wurde. Würdest Du Dich bereiterklären mal einen Blick über mein Programm zu werfen wenn ichs Dir gezipt schicken würde? *liebguck* PS: Hab es in die InitInstance kopiert. Mein AnmeldeDialog is weg aber der Fehler bleibt Zitieren
Filou Geschrieben 28. Februar 2006 Autor Geschrieben 28. Februar 2006 Ich habe das Problem gelöst. Dank Klotzkopp!! *auf die Knie fall* Also der Thred hier kann geschlossen oder gelöscht werden. Nochmal viiiiiiiiilen Dank!!!!!!!!!!!!! Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.