Dateien kopieren funzt einfach nicht...
-
Hi Jungs,
eventuell kann mir jemand helfen.. ich werde noch bekloppt heute
System: Win XP SP2
Sprache VC++bool CInstallThread::CopySH(LPCTSTR pFromFolder, LPCTSTR pToFolder) { //--- copy - routine --- CString from = pFromFolder; CString to = pToFolder; from += '\0'; to += '\0'; SHFILEOPSTRUCT fo; fo.fAnyOperationsAborted = NULL; fo.hwnd = NULL; fo.hNameMappings = NULL; fo.lpszProgressTitle = NULL; fo.wFunc = FO_COPY; fo.pFrom = from; fo.pTo = to; fo.fFlags = FOF_NOCONFIRMMKDIR | FOF_NOERRORUI | FOF_NOCONFIRMATION | FOF_SILENT; if( ::SHFileOperation(&fo) ) { DWORD dw = GetLastError();//only for debugging return false; } return true; }mein Problem: es wird nix kopiert. GetLastError() gibt mir ERROR_INVALID_HANDLE zurück.
from und to sind jeweils die Dateipfade. Der to Pfad existiert noch nicht, soll silently angelegt werden.Warum bekomm ich da nur ERROR_INVALID_HANDLE zurück? Wenn ich die Flags wegnehme, dann funzts, aber man muss halt alles bestätigen, was ich nicht möchte.
Jemand ne Ahnung? Hoffe die Infos reichen, wenn nicht einfach fragen

-
Ich denke mal es liegt am hwnd ein anderes Handle seh ich nicht.
schirrmie
-
Wie sehen denn deine Pfade aus? Da hatte ich mal sehr lange Probleme mit..
-
Und wenn du hier: fo.hwnd = NULL; mal das Handle des übergeordneten Fensters angibst?
-
ich habs grad rausgefunden...
das übergebene handle ist gemeint... also &fo...
wenn man FOF_NOCONFIRMATION und FOF_NOERRORUI gleichzeitig nutzt, ist das komplette struct ungültig. ka warum... ohne FOF_NOERRORUI läufts.
-> ich hab kein übergeordnetes fenster
ist nen thread ;)...
-
1. Nicht GetLastError verwenden (laut MSDN)
2. Wenn der Returncode von SHFileOperation 0x402 ist, dann sind pFrom und pTo nicht doppel-0-terminiert (überprüfe via Debugger).
In dem Fall C-Strings verwenden, Parameter kopieren und am ende noch eine 0 hinzufügen
-
Airdamn schrieb:
1. Nicht GetLastError verwenden (laut MSDN)
2. Wenn der Returncode von SHFileOperation 0x402 ist, dann sind pFrom und pTo nicht doppel-0-terminiert (überprüfe via Debugger).
In dem Fall C-Strings verwenden, Parameter kopieren und am ende noch eine 0 hinzufügenääehm... was mache ich da wohl? :
... CString from = pFromFolder; CString to = pToFolder; from += '\0'; to += '\0';...aber das, was ich eben geschrieben habe, ist scheinbar doch nicht der fehler...
-
Überprüf den Rückgabewert (ohne GetLastError) und schau, was rauskommt.
-
mein Rückgabewert ist 0x000004c7
stimmt mit keinem der werte aus der msdn überein. ich heul gleich...
-
0x000004c7 scheint wohl "abbruch durch benutzer" zu sein... hm...
-
so, ich hab den mist jetz...
Wenn man FOF_SILENT setzt, dann muss man zwingend ein HWND angeben, weil dann dort die Statusinfos hingesendet werden

Wer sich sowas ausdenkt
Weiß jetzt zufällig einer, wie ich auf die Statusinfos in dem HWND reagieren kann?
-
Machine schrieb:
Wenn man FOF_SILENT setzt, dann muss man zwingend ein HWND angeben, weil dann dort die Statusinfos hingesendet werden

Oh, das wusste ich bisher noch nicht. Ist aber spannend zu wissen.
Wer sich sowas ausdenkt

Leute, die sich mal vernünftig Gedanken gemacht haben.
Weiß jetzt zufällig einer, wie ich auf die Statusinfos in dem HWND reagieren kann?
Oh, das wäre auch gut zu wissen.