Probleme mit Unicode bei Drag & Drop Aktionen

  • Hallo

    Ich hab folgendes Problem: Wenn ich Dateien per Drag & Drop auf meine GUI ziehe (um den Dateipfad zu erhalten), dann bekomme ich zb statt kyrillisch lauter Fragezeichen im Dateinamen. Leider verstehe ich Drag & Drop nicht ganz, ich habe die nötige Funktion dafür mir nur zusammengeklaut aus dem Internet. Nativ jedenfalls scheint AutoIt Unicode zu beherrschen, gebe ich betreffende Dateinamen per Code in die Variablen, bleibt das kyrillisch erhalten. Nur bei Drag & Drop nicht.

    Folgende Funktion verwende ich:

    Spoiler anzeigen
    [autoit]

    Func WM_DROPFILES_FUNC($hWnd, $msgID, $wParam, $lParam)
    Local $nSize, $pFileName
    Local $nAmt = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", 0xFFFFFFFF, "ptr", 0, "int", 255)
    For $i = 0 To $nAmt[0] - 1
    $nSize = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", 0, "int", 0)
    $nSize = $nSize[0] + 1
    $pFileName = DllStructCreate("char[" & $nSize & "]")
    DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", DllStructGetPtr($pFileName), "int", $nSize)
    ReDim $gaDropFiles[$i+1]
    $gaDropFiles[$i] = DllStructGetData($pFileName, 1)
    $pFileName = 0
    Next
    EndFunc ;==>WM:DROPFILES_FUNC

    [/autoit]


    Und so wird die gedraggte Datei eingefangen:

    Spoiler anzeigen
    [autoit]

    Case $GUI_EVENT_DROPPED
    For $i = 0 To UBound($gaDropFiles) - 1
    DroppedFile = $gaDropFiles[$i]
    Next

    [/autoit]


    Hat das was mit der Shell32.dll zu tun? Ich nutze Windows 7 x64.

    Das komische ist wenn ich per Drag & Drop eingefangene Dateipfade per FileExist checke, ist das Ergebnis positiv. Außerdem erkennt der die Fragezeichen die er anzeigt nicht als solche. Aber ich kann damit nicht arbeiten, denn wenn ich den Dateipfad zb an MediaInfo oder in ein Editfeld eines externen Programmes schicke, können diese damit nichts anfangen. Wenn ich den Pfad allerdings manuell in die Variable eintrage oder zb per Parameter übergebe, bleibt er korrekt erhalten und die externen Programme können damit umgehen.

    Ich hoffe ihr versteht wie ich das meine.

    1. Beispiel:
    Der Dateipfad "C:\привет.txt" wird per Parameter oder per Hand in eine Variable geschrieben. Der Pfad wird nun korrekt in einer MsgBox angezeigt und kann auch von externen Programmen verarbeitet werden (zb per ControlSetText).

    2. Beispiel
    Der gleiche Dateipfad "C:\привет.txt" wird per Drag & Drop auf die GUI gezogen und in eine Variable geschrieben. Der Pfad wird nun in einer MsgBox zb als "C:\?????.txt" angezeigt und kann nicht von externen Programmen verarbeitet werden. Allerdings scheint AutoIt selbst die Datei per FileExist zu finden und die Variable an sich nicht zu konvertieren, da trotz Anzeige keine Fragezeichen in der Variabel auffindbar sind...

    Puh... bin gespannt ob ihr mir helfen könnt.