CFileDialog: Mehrfaches Aufrufen führt zu Absturz (Access violation)! warum? [gelöst: Windows Problem, nicht C++...]



  • Hallo allerseits!

    Mein Problem ist das folgende:

    Zum lesen einer Textdatei rufe ich zunächst einmal CFileDialog auf um die Datei auswählen zu können.
    Einmal klappt das auch einwandfrei, aber beim zweiten oder dritten Mal, dass ich das versuche, schmiert die Anwendung kurz nach Anzeigen des Dateiwahl-Dialogs einfach ab:
    Im Release Modus: Programm wird ohne Meldung beendet.
    Im Debug Modus: Meldung:

    Unhandled exception at 0x7ca6158e in probierwiese.exe: 0xC0000005: Access violation reading location 0x01314608.

    und zwar bei der Zeile, wo die DoModal() Funktion aufgerufen wird.

    Hat jemand eine Idee, woran das liegen könnt und wie ich das vermeiden kann?

    Danke und Gruß,
    Dong

    P.S.:
    Die Betreffende Funktion:

    void CprobierwieseDlg::OnBnClickedButton2()
    {
    	CFileDialog lesedialog(TRUE,static_cast<LPCTSTR>(L"txt"),NULL,OFN_EXPLORER,static_cast<LPCTSTR>(L"Textdatei (*.txt) |*.txt|Textdatei (*.dat) |*.dat|alle Dateien (*.*) |*.*|" )); 
    	CString dateipfad;
    	if (lesedialog.DoModal() == IDOK) // <-- Im Debug Modus kommt an dieser Stelle bei wiederholtem Aufruf die Fehlermeldung
    	{
    		dateipfad = lesedialog.GetPathName();
    	}
    	ifstream dateilies;
    	dateilies.open(dateipfad,ios::in);
    	string lies;
    	while (dateilies.eof() == false && lies != "egal")
    	{
    		dateilies >> lies;
    		CString test;
    		test = lies.c_str();
    		MessageBox(test);
    	}
    	dateilies.close();
    
    }
    

    Edit: "Access violation" in Titel eingefügt

    Edit 2:
    P.S.2:
    An den ganzen Argemuenten des CFile Dialog Konstruktors liegt es nicht:
    Das selbe Problem tritt auch auf, wenn ich einfach nur

    CFileDialog lesedialog(TRUE);
    

    verwende.



  • Ich konnte das Problem zwar noch nicht lösen, aber ich habe da so einen Verdacht:

    Beim aufrufen (DoModal() eben...) von CFileDialog werden 3 neue Threads gestartet, die danach auch nicht mehr verschwinden. Auch nicht, wenn die Funktion, in der CFileDialog als lokale Variable definiert ist länst verlassen wurde.

    Ist das normal?
    Könnte das die Ursache des Problems sein?
    Wenn ja: Was kann ich dagegen machen?

    Danke und Gruß,
    Dong



  • scheint ein MFC Bug zu sein:
    http://support.microsoft.com/default.aspx?scid=kb;EN-US;256329

    😞 😞 😞 😞

    Steps to reproduce the behavior
    1. Create an MFC application with a custom CFileDialog dialog box.
    2. From the button handler of this dialog box, create a regular CFileDialog dialog box. For example:

    CMyFileDialog::OnButton1()
    {
       CFileDialog dlg(TRUE);
       dlg.DoModal();
    }
    

    3. Rebuild and run the application.
    4. Open the custom dialog box, click the button to open the second dialog box, select a file, and then click Open.

    Was ziemlich genau das ist, was ich machte.

    RESOLUTION
    The Mfc42.dll and Mfc42u.dll files that are included with Microsoft Windows 2000 incorporate a fix for this problem.

    Damit kann ich aber nicht viel Anfangen, ich habe kein Windows 2000.

    Irgendwelche andere Ideen?
    Es kann ja wohl nicht sein, dass man von einer MFC Anwendung aus nicht zwei Dateien öffnen kann! 😡



  • äh, ah ja:

    <a href= schrieb:

    http://support.microsoft.com/default.aspx?scid=kb;EN-US;256329">This bug was corrected in the latest service pack for Visual Studio 6.0.

    *runterlad* 😉
    (wollte ich sowieso schon seit langem machen, aber vom VS kommt man nur auf die Microsoft Update Seite (statt direkt zu http://msdn.microsoft.com/vstudio/downloads/updates/ ), die mit Firefox nicht geht und dann war mir das ganz zu aufwendig...)



  • *Monolog fortsetz*

    Ups, das wars wohl doch nicht, ich habe ja gar nicht VS 6.0, sondern VS 2005, ich Depp... 😡

    *weiter nach Lösung such....*



  • dong schrieb:

    *weiter nach Lösung such....*

    Suche erfolgreich 😃 , und zwar in diesem Thread in einem MSDN Forum:
    http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=439371&SiteID=1

    Ergebnis:
    Es ist nicht speziell ein Problem meines Programms, sondern ein generelles Windows XP SP2 Problem (in Verbindung mit bestimmter Software...) ! 😮 😮 😮

    Es passiert z.B auch in Notepad.exe:
    Einmal öffnen OK, beim zweiten Mal öffnen: Absturz!

    Siehe auch hier:
    http://support.microsoft.com/kb/909486/en-us

    Gruß,
    Dong



  • Ende der Geschichte:

    Bei Microsoft angerufen, Hotfix zugeschickt bekommen, alles klar. 😃



  • Hallo Forum,

    wie es aussieht, habe ich das gleiche Problem. Nach mehrmaligem OpenDlg.DoModal() kommt:

    Eine Ausnahme (erste Chance) bei 0x7e701beb in prog.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x019c3368.

    😞
    Kennt jemand einen Workaround?
    Weiss jemand zufällig noch, was ist das für ein Hotfix, das dong im Jahre 2006 bekommen hat?
    Oder muss man da bei Microsoft anrufen, um es zu bekommen?


  • Mod

    Eine First Chance Exception ist kein Fehler!



  • Martin Richter schrieb:

    Eine First Chance Exception ist kein Fehler!

    Kein Fehler?...
    Danach kommt ja gleich:

    Unbehandelte Ausnahme bei 0x7e701beb in winsim.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x01be3368.

    Dann bekomme ich Assembler-Code angezeigt:

    ...
    7E701BCF  mov         ebx,eax 
    7E701BD1  test        ebx,ebx 
    7E701BD3  jl          7E6AE935 
    7E701BD9  push        dword ptr [ebp-230h] 
    7E701BDF  mov         eax,dword ptr [ebp-234h] 
    7E701BE5  mov         eax,dword ptr [eax+1C4h] 
    7E701BEB  mov         ecx,dword ptr [eax]
    

    Der Debugger steht in der Zeile 8.
    Register-Ausgabe Fenster:

    EAX = 01BE3368 EBX = 00000000 ECX = 01BBF1DE EDX = 01BBF1D6
    ESI = 01BBF3E0 EDI = 00195148 EIP = 7E701BEB ESP = 01BBF134
    EBP = 01BBF37C EFL = 00000246

    01BE3368 = ????????

    Ich frage mich auch, ob CFileDialog wirklich daran schuld ist...

    Vielleicht mache ich irgendwas falsch. So sieht ungefähr meine Dialog-Klasse aus:

    Dummy::Dummy(CWnd* pParent) :
        CDialog(Dummy::IDD, pParent),
        ...
        m_FileOpenDialog(
                TRUE,                                   // File open dialog
                _T("bin"),                              // Filter for wave files
                NULL,                                   // No initial filename
                (OFN_EXPLORER | OFN_ENABLESIZING),      // Flags
                _T("Binary files (*.bin)|*.bin||"),     // Filter for wave files
                NULL,                                   // Parent window
                0),                                     // MFC determines the proper dialog box size
    {
    }
    
    BEGIN_MESSAGE_MAP(Dummy, CDialog)
        ON_BN_CLICKED(IDC_BUTTON_LOAD, &Dummy::OnBnClickedLoad)
    END_MESSAGE_MAP()
    
    void Dummy::OnBnClickedLoad()
    {
        m_Load();
    }
    
    void Dummy::m_Load()
    {
        if (IDOK != m_FileOpenDialog.DoModal())
        {
            // User canceled operation, so do nothing
            return;
        }
        ...
    }
    

    😕



  • Nach einigen Tests auf zwei anderen PCs sieht es so aus, das Problem tritt nur auf meinem Entwicklungs-PC auf. Auf anderen PCs ist das Problem nicht reproduzierbar.
    Das Problem ist auch nicht auf mein Programm beschränkt, sondern andere Programme sich davon betroffen. Es scheint jetzt auch so zu sein, dass es nur mit dem gewählten Filter _T("Binary files (.bin)|.bin||") auftritt. Zum Beispiel, öffne ich Notepad.exe und versuche darin bin-Dateien zu öffnen, einmal klappt es. Beim zweiten Versuch, eine bin-Datei zu öffnen, öffnet sich das Dialog-Fenster und sobald ich mit der Maus über bin-Dateien streife, stürzt auch Notepad ab. Sehr merkwürdig das Ganze. Es sieht so aus, sobald ein Tool-Tip für bin-Dateien angezeigt werden will, stürzt es ab...
    Wähle ich beim Anlegen der CFileDialog Instanz anderen Filter, z.B. txt-Dateien, läuft das Programm wunderbar und CFileDialog Instanz verursacht keine Ausnahme.
    Kennt jemand vielleicht diese Symptome? Einen Workaround? Was könnte es sein?
    😕

    PS: Habe übrigens noch etwa 800 MByte von Windows Updates, Service Packs für VS2005 und was weiss der Teufel was "upgedatet". Die Abstürze finden trotzdem statt...


Anmelden zum Antworten