Zugriffsverletzung bei "Drag and Drop"



  • Ich habe hier ein kleines Programm, welches Dateien auflisten soll, welche man aus dem Explorer per drag and drop auf das Formular zieht. Nun Funktioniert dies auch schon, allerdings nur beim ersten mal. Wenn ich das zweite mal eine Datei auf das formular ziwehe, bekomme ich eine Zugriffsverletzung und mein Programm wird beendet.

    Die frage ist nun, was mache ich falsch?

    void CTabMessage::OnDropFiles(HDROP hDropInfo)
    {
        UINT i;
        UINT nFiles = ::DragQueryFile(hDropInfo, (UINT) -1, NULL, 0);
        for (i = 0; i < nFiles; i++)
        {
            CString szFileName;
            ::DragQueryFile(hDropInfo, i, 
                            szFileName.GetBuffer(szFileName.GetLength()),
                            _MAX_PATH);
            AfxMessageBox(szFileName);
    	szFileName.ReleaseBuffer();
        }  // end for
        ::DragFinish(hDropInfo);
    }
    

    in meiner MessageMap steht:

    ...
    ON_MESSAGE(WM_DROPFILES, OnDropFiles)
    ...
    

    und in meiner Headerdatei steht:

    ...
    protected
      afx_msg void OnDropFiles(HDROP hDropInfo);
    ...
    


  • Jag2ooo schrieb:

    ::DragQueryFile(hDropInfo, i, szFileName.GetBuffer(szFileName.GetLength()),_MAX_PATH);
    

    Das kann gar nicht gut gehen - du übergibst der Funktionen einen 0 Byte (szFileName ist leer, hat also Länge 0) und sagst ihr, daß sie dort MAX_PATH Zeichen unterbringen kann. Da ist es erstaunlich, daß dir die Anwendung nicht schon beim ersten Anlauf um die Ohren fliegt.



  • Ok, das sehe ich ein, aber was muss ich statt der 0 übergeben? ich habe auch _MAX_PATH übergeben, aber am Zustand ändert sich nichts. Beim ersten mal klappt, beim zweiten mal nicht.



  • Ich habe nochmal nachgeforscht und das ist richtig, dass ich beim ersten Aufruf von DragQueryFile ne 0 übergebe, denn so soll man das machen, wenn man wissen will, wieviele Dateinamen übergeben wurden, damit man die in der Schleife zuerflücken kann.

    Meine Vermutung geht in die Richtung, dass nen Aufruf (SetWindowLongPtr) in meinem Create des Dialoges fehlt. Ich habe aber keine Ahnung, was ich da wie übergeben soll. Ich habe zwar ne Referenz bei MSDN gefunden, werd da aber nicht schlau draus.


Anmelden zum Antworten