CFileDialog gibt ne Access Violation
-
Hallo,
ich hab da ein Problem, dass ich eigentlich nicht haben dürfte...

Ich will innerhalb einer Funktion ein File-Öffnen-Dialog öffnen, wo man sich
ne Datei auswählt und erst mal den Dateinamen in ne CString reingespeichert
wird.
Das funktioniert ganz gut, bis man OK oder Abbrechen drückt, dann gibts ne
Access-Violation.
Ich weiss nicht warum, ich habs schon mit verschiedenen Initialisierungen von
CFileDialog versucht -> immer das Gleiche.
Hat da jemand von Euch das gleiche Prob schonmal gehabt und ne Lösung gefunden?vg, marco!
bool CMeinDialog::Dateipfad() { CString filename; CFileDialog FileDialog(TRUE); if (FileDialog.DoModal() == IDOK) { filename = FileDialog.GetFileName(); } return TRUE; }
-
Wenn das Programm im Debugger laufen lässt, wo stehst du denn bei der AccessViolation? Also welches ASSERT funktioniert nicht?
Oft gib's dort einen Hinweis auf das Problem.
-
beim Debug-Erstellmodus geht alles einwandfrei.
beim Release öffnet er den Dialog, mann kann ne Datei auswählen
und er gibt den Filenamen auch korrekt in der MessageBox an, macht
danach allerdings die Grätsche
.
Hier, was ich geändert habe, damit du weisst wovon ich rede:CString filename; CFileDialog FileDialog(TRUE); DWORD result; result = FileDialog.DoModal(); if (result == IDOK) { filename = FileDialog.GetFileName(); AfxMessageBox(filename); } else if(result == IDCANCEL) { AfxMessageBox("Abbrechen wurde gewählt"); }
-
in der Violation steht:
Unbehandelte Ausnahme in MeinProg.exe (KERNEL32.DLL): 0x0000005: Access Violation
-
Achso - ich habe "ASSERT" gelesen, wo "Access" stand....
Also mit diesem Stück Code ist alles in Ordnung.
Die Frage ist, was passiert noch alles mit FileDialog und filename?Aber wenn ein Programm freundlicherweise nur in der Release-Version abstürzt, liegt das oft daran, dass irgendwo Speicher überschrieben wird. Vielleicht uninitialisierter Pointer oder so was.
Du kannst auch die Releaseversion mit Debuginformation kompilieren, dann gibt's wegen des Optimizers zwar manchmal merkwürdige Debugpositionen und Variableninhalte, aber es hilft ein wenig bei der Fehlersuche.
Oder du überspringst Programmteile, die eventuell Probleme machen, um die Stelle einzukreisen, wo Speicher überschrieben werden könnte.
Oder du streust noch 'ne Menge MessageBoxes in den Code, um dich an die Problemstelle ranzutasten.
Auf jeden Fall - Fehlersuche in der Release-Version ist immer eine lästige Sache. Viel Erfolg!
-
lol, na danke

-
gibts da vielleicht noch ne andere möglichkeit, als diesen Dialog zu verwenden
(ich bin zu faul zum suchen *rofl*)
-
Hallo!!!
Ich hab den Fehler gefunden!!!!!!!!!
Grund:
ich will die funktion LockWorkStation() verwenden und musste daher in den
Einstellungen unter Projekt-Optionen die WinVersion eintragen:
/D _WIN32_WINNT=0x0501 /D WINVER=0x0501der 1. Eintrag löste den Fehler aus.
Allerdings geht jetzt die LockWorkStation() nicht mehr
.
Geht das auch irgendwie anders?
Evtl. mit Tasten-Simulation (Win-Taste + L)????