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.


Anmelden zum Antworten