Frage zu SHFILEOPSTRUCT



  • folgender Code:

    SHFILEOPSTRUCT ShFile;
    
    	char zFrom[MAX_PATH];
    	char zDest[MAX_PATH];
    
    	for(int i=0; i<MAX_PATH; ++i )
    	{
    		zFrom[i] = '\0';
    		zDest[i] = '\0';
    	}
    
    	strcpy(zFrom, From.c_str());
    	strcpy(zDest, Dest.c_str());
    
    	ShFile.hwnd   = GetActiveWindow();
    	ShFile.wFunc  = FO_COPY;
    	ShFile.pFrom  = zFrom;
    	ShFile.pTo    = zDest;
    	ShFile.fFlags = FOF_NOCONFIRMATION | FOF_NOCONFIRMMKDIR;
    
    	bool result = SHFileOperation( &ShFile );
    	ShFile.fAnyOperationsAborted;
    

    funktioniert auf meinem Rechner( Win7 ) so wie er soll. Wenn ich die EXE allerdings auf meinem 2. Rechner( Win XP ) ausführe, kommt der Fehler 'Datei kann nicht kopiert werden. die Quelldatei oder vom Quelldatenträger kann nicht gelesen werden'
    😕 😕 😕

    Woran kann das liegen?
    Ich versuche und versuche, aber alles bleibt wie oben beschrieben?!

    grüssle 🙂



  • Dieser Thread wurde von Moderator/in akari aus dem Forum VCL (C++ Builder) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Der String in pFrom u pTo müssen doppelt NULL-terminiert sein.
    Die for-Schleife kann gelöscht werden. Schreibe stattdessen lieber

    ZeroMemory(zFrom,sizeof(zFrom));
    

    um sicherzustellen, dass es doppelt NULL-terminiert ist:

    zFrom[lstrlen(zFrom)+1] = '\0';
    zDest[lstrlen(zDest)+1] = '\0';
    

    ist nicht schön, aber funktioniert. Wenn Du das machst kannst Du Dir das ZeroMemory() sparen.


  • Mod

    Doku lesen ⚠ Es steht so fett drin dass man es eigentlich nicht übersehen kann oder?
    http://msdn.microsoft.com/en-us/library/bb759795(VS.85).aspx

    pFrom
    LPCTSTR
    Note This string must be double-null terminated.
    A pointer to one or more source file names. These names should be fully-qualified paths to prevent unexpected results.

    Standard MS-DOS wildcard characters, such as "*", are permitted only in the file-name position. Using a wildcard character elsewhere in the string will lead to unpredictable results.

    Although this member is declared as a single null-terminated string, it is actually a buffer that can hold multiple null-delimited file names. Each file name is terminated by a single NULL character. The last file name is terminated with a double NULL character ("\0\0") to indicate the end of the buffer.



  • Das Problem war der abschließende '\'. Win XP bringt einen Fehler wenn vorhanden, Win 7 ist es egal ob er da ist oder nicht 🙄

    grüssle 🙂


  • Mod

    Smitty schrieb:

    Das Problem war der abschließende '\'. Win XP bringt einen Fehler wenn vorhanden, Win 7 ist es egal ob er da ist oder nicht 🙄

    Nein! Dem ist es auch nicht egal, aber durch Zufall ist der Speicher an der Stelle evtl. 0 gewesen und das hat bei dieser Maschine dazu geführt das es geklappt hat...


Log in to reply