Dialogbox verursacht Exception beim Beenden der Anwendung (Acces Violation)



  • Hi!

    Bin dabei, eine kleine Auswertungssoftware für eine Sensorplatine zu entwickeln. Hab allerdings jetzt schon ein Riesenproblem, obwohl ich noch bei den Standarddingen bin.

    Die Anwendung hat bisher ein kleines Menü und eine Statusleiste. Über das Menü kann man via "Auswertung" -> "Pfad zur Wertedatei" den Pfad zu einer HEX- Datei angeben. Dieser wird dann in der Statusleiste angezeigt. Anonsten kann das Programm noch nichts.

    Das Problem: Sobald ich den Dateiauswahldialog wie beschrieben aufgerufen habe und dort den Ordner wechsle, erscheint beim Beenden eine Exception. Wenn ich den ORdner nicht wechsle und gleich auf Abbrechen klicke, kommt die Exception nicht.

    Der Debugger von Visual Studio 2008 sagt folgendes:

    Eine Ausnahme (erste Chance) bei 0xfeeefeee in DHBW BeschlAuswert.exe: 0xC0000005: Access violation.
    Unbehandelte Ausnahme bei 0xfeeefeee in DHBW BeschlAuswert.exe: 0xC0000005: Access violation.

    Hab das gesamte Projekt als RAR- Archiv: www.allack.de/beschlauswert.rar

    Danke für Eure Hilfe!!!

    Grüße, Allack



  • Hallo,

    was für Ursachenforschung hast Du bereits betrieben? Was waren deren Ergebnisse? In welcher Codezeile findet die Exception statt?

    mfg Martin



  • Ich habe versucht, mittels Debugger auf den Fehler zu kommen, was mir allerdings nicht gelungen ist. Die Exception wird erst, nachdem das Fenster bereits geschlossen wurde, aufgerufen (bzw gemeldet).

    Ich weiß bisher nur, dass es mit dem Dialogfenster zu tun haben muss. Bricht man dieses direkt ab, kommt die Exception nicht. Wechselt man nur den Ordner und bricht es dann ab, so kommt die Exception bereits. Und auch wenn man eine Datei auswählt, egal welche und in welchem Ordner, so erscheint die Exception.

    Hab versucht, etwas in der OPENFILENAME- Struktur zu entdecken, aber der Vergleich mit einem funktionierenden Programm und dessen Werte in dieser Struktur hat absolute Gleichheit ergeben.

    Ein schrittweises Durchlaufen des Codes ab der Nachricht zum Beenden des Programms über das Menü hat mich auch auf nichts gebracht. Es scheint, als würden etwaige Exceptions erst nach Beenden der main abgefragt und behandelt, so dass man nicht wirklich sagen kann, wo diese Exception auftaucht.

    Kurz gesagt, habe ich keine brauchbaren Ergebnisse bisher. Und meine Ratlosigkeit übersteigt langsam meine Geduld... Jeder Versuch schlägt fehl 😞



  • Hallo,

    wenn der Absturz im Exitcode erfolgt kann es verschiedene Ursachen haben. Beispiele wären ein Pufferüberlauf, ein verbogener Zeiger oder ähnliches. Was macht denn Dein Programm, wenn der Benutzer in der Dateiauswahlbox OK geklickt hat.

    mfg Martin



  • Bisher macht es nichts weiter, als den Pfad zur ausgewählten Datei in die Statusleiste zu schreiben:

    if(GetOpenFileName(&ofn))
        {
            SendDlgItemMessage(hWnd, IDC_MAIN_STATUS,
                               SB_SETTEXT, 1, (LPARAM)szFileName);
        }
    

    Das funktioniert auch einwandfrei, also es wird immer der Pfad der ausgewählten Datei an die richtige Position der Statusleiste geschrieben.

    Mehr ist noch nicht vorhanden, das kommt dann alles später noch, sobald das erst mal funktioniert.

    Testweise habe ich mal noch über CreateFile() ein Handle angelegt und dieses danach wieder geschlossen. Hab gedacht, vielleicht muss ich was mit der ausgewählten Datei machen, also dass er sonst meckert. Hat aber auch nichts gebracht...

    Außerdem hab ichs mal noch probiert, im Fehlerfall etwas zu tun, also wenn GetOpenFileName() FALSE liefert. Hab dann getestet, ob das durch Abbrechen oder durch einen Fehler hervorgerufen wurde und entsprechene Warnmeldungen ausgegeben. Aber ebenfalls ohne Erfolg...



  • Hallo,

    hab mir jetzt doch mal Dein RAR-File reingezogen. Da ich allerdings kein VS2008 besitze, kann ich es nicht testen und es nach BC++ zu portieren habe ich dann doch keine Lust.

    Aber mal ein paar Tips:

    Insgesammt sieht es nach einem Pufferüberlauf aus. Da Du allerdings nicht sehr viele Puffer hast, sollte es ein leichtes sein, den zu finden.

    Bekommst Du vom Debugger einen ordentlichen Call-Stack?

    Deklariere einfach mal szFilename in DateipfadHolen statisch. Wie lange ist der Pfad zur Datei, die Du ausgewählt hast? Ich habe im MSDN gelesen, daß bis WinXP die maximale Länge eines Status-Textes 127 Zeichen beträgt. Wähle einfach mal eine Datei mit einem kurzen Pfad und Namen.

    Schreibe einfach mal zum Testen, einen festen Sring in die Statuszeile statt dem ausgewählten Dateinamen.

    Merkwürdig finde ich auch, daß Du den Windowsklassennamen aus der Ressource lädst. Das ist unnötig.

    Ansonsten habe ich allerdings auch nichts durchs Quelltextlesen gefunden.

    Viel Glück.

    Martin



  • Hab schnell noch getestet, ob es mit der statischen Deklaration von szFilename klappt. Leider negativ.
    Dann hab ich eine Datei direkt auf 😨 angelegt. Der gesamte Pfad hatte so keine 10 Zeichen. Immer noch negativ.
    Konstanter Text für die Statusbar statt des Dateipfades: Auch negativ.

    Das mit dem Laden des Klassenname ist aus dem Template. Kommt so direkt vom VS. Wenn ich das Grundgerüst selbst angelegt hätte, würd ich den Umweg auch nicht gehen 🙂

    Werd mir morgen nochmal die ganzen Puffer genauer ansehen und hoffe, dabei etwas zu finden.

    Ich danke Dir auf jeden Fall für Deine Hilfe!!!



  • Hallo,

    habe schlechte Nachrichten. Hab's dann doch mal mit VS2003 unter WinXP übersetzt. Hier funkt es. Dann habe ich natürlich gar keine Chance Dir zu helfen. Sorry.

    mfg Martin



  • Hmm... Könnte es also einfach an meinem System liegen!? Jetzt sollte ich nen anderen PC mit dem gleichen OS und VS haben, um es auf dem zu testen.

    Hab über meine Uni VS2010 Ultimate gratis erhalten, werds demnächst mal damit probieren. Die Hoffnung stirbt zuletzt.

    Aber ich danke Dir für all Deine Hilfe!!!



  • Mal eine kleine Frage zwischendurch:

    Nutzt du Windows Vista oder höher ? Wenn ja, probiere doch mal dein Program als Admin zu starten, oder die Benutzerverwaltung auszuschalten und dann dein Program zu testen.

    Ich habe nämlich unter Vista schon beobachtet dass gewisse Programme für XP gerne beim Beenden abstürzen, wo unter XP alles prima läuft.



  • Ich benutze Windows 7. Werd Deinen Tipp mal testen, sobald ich von der Arbeit wieder zu Hause bin.

    Zum Status mit dem Test unter der neuen VS- Version: Hier funktioniert alles tadellos... Möglicherweise liegts an meiner VS2008- Installation oder deren Zusammenspiel mit meinem OS. Werd aber das von "Bitte ein Bit" noch testen, um auch diese Gewissheit zu haben.


Anmelden zum Antworten