Mit Freude habe ich HeikoAdams Code übernommen, da er mir sehr gut zupass kam.
Bei der Verwendung stellt sich dann aber heraus, dass er ein paar Fallstricke enthält.
So berücksichtigt der Code leider nicht den Fall, dass der Anwender (so wie ich) von sich aus bereits ein '\\?\' vor die Dateinamen setzt.
In einem solchen Fall enthalten sQuelle und sZiel nur leere Strings, aber leider liefert die Funktion trotzdem (!) eine 0 als Zeichen für eine korrekte Ausführung.
Und, wie schon bemerkt, darf man leider auch nicht einfach ein '\\?\' vor
alle Dateinamen setzen. Bei Dateinamen >= MAX_PATH
muss es stehen, bei kürzeren
darf es nicht stehen. Das muss man nicht verstehen, vor allem nicht, da Microsoft
schreibt:"SHFileOperation fails on any path prefixed with "\\?\"." Der zurückgegebene Fehlercode 124 hat nichts mit dem Windows-Fehlercode "Die Ebene des Systemaufrufs ist falsch" zu tun. Microsoft erklärt
hier, dass es sich um "Prä-Windows-Fehlercodes" handelt. Der Code bedeutet "The path in the source or destination or both was invalid." An gleicher Stelle teiltMicrosoft zudem mit, dass man neben dem Rückgabewert auch
fAnyOperationsAborted auswerten muss (" If you do not check fAnyOperationsAborted as well as the return value, you cannot know that the function accomplished the full task you asked of it and you might proceed under incorrect assumptions.")
Ich habe daher den Code etwas umgegraben. Für mich funktioniert er; das tat er bei HeikoAdams aber auch, warten wir also wieder drei Jahre.
PS: Ich ziehe den Code zurück, siehe Beitrag unten.