CopyFile() kopiert nicht



  • Hi,
    ich habe folgendes Problem wenn ich untenstehenden Code ausführe wird die Datei ncht wie gewollt nach "c:\xyz.exe" kopiert sondern es wird eine Datei mit dem Namen "㩣汜汯琮瑸" erstellt und das im lokalen Ordner wo das Programm liegt und das ist nicht C:\!

    danke schonmal

    #include <iostream>
    #include <windows.h>
    #include <winbase.h>
    
    using namespace std;
    
    int main()
    {
        TCHAR szPath[MAX_PATH];
        GetModuleFileName( NULL, szPath, MAX_PATH );
    	cout << "Datei wird kopiert!" << endl;
    	CopyFile(szPath, LPCWSTR ("c:\\xyz.exe"),FALSE);
    	cout << "Datei kopiert" << endl;
    }
    


  • Guck dir den Rückgabewert an und gegebenenfalls den Wert den GetLastError() liefert.

    Simon



  • es wird "0 (0x0)" zurückgegeben



  • Hi

    Ist ja auch klar wen du falsch cast-ist.

    so sollte doch das sein !

    CopyFile( szpath ,(LPWSTR) "c:\\abc.exe" ,FALSE );

    Lowbyte



  • gulbim schrieb:

    CopyFile(szPath, LPCWSTR ("c:\\xyz.exe"),FALSE);

    Lass mich raten: Der Compiler hatte sich beklagt, dass der den zweiten Parameter nicht nach LPCWSTR konvertieren kann?

    Es ist sehr sehr selten eine gute Idee, das dann dadurch zu beheben, dass man den Ausdruck mit der Holzhammermethode (Cast) in den gewünschten Typ quetscht. Das Ergebnis ist meistens, dass man einen Compilezeitfehler gegen einen Laufzeitfehler eintauscht. Also bitte merken: Ein Cast ist fast immer der falsche Weg.

    lowbyte_ schrieb:

    so sollte doch das sein !

    CopyFile( szpath ,(LPWSTR) "c:\\abc.exe" ,FALSE );

    Genauso falsch.

    CopyFile(szPath, _T("c:\\xyz.exe"),FALSE);
    


  • Hi

    Oder einfach so...

    CopyFile(szPath, L"c:\\xyz.exe",FALSE)
    

    lowbyte



  • @MFK
    Deins hat leider auch nicht funktioniert allerdings hatte ich bei meiner Variante keinen Fehler erzeugtes hat nur nicht richtig fuktioniert.

    @lowbyte_
    Danke, dein zweiter Vorschlag hat geholfen und jetz klap es. Aber könntest du mir vielleicht noch erklären was diese "L" ist und was es bewirkt. Wäre echt nett danke.



  • Das "L" wandelt deinen ansistring zur compiletime in ein unicodestring um.
    dessen zeichen sind 2Byte groß. (wchar_t statt char).

    wenn du einen char-string mit einem cast umwandelst, hast du einen kaputten string,
    bei dem mit großer wahrscheinlichkeit nichtmal der 0-terminator passt.



  • gulbim schrieb:

    Deins hat leider auch nicht funktioniert

    "Funktioniert nicht" ist keine ausreichende Fehlerbeschreibung.

    gulbim schrieb:

    allerdings hatte ich bei meiner Variante keinen Fehler erzeugtes hat nur nicht richtig fuktioniert.

    Und nicht richtig Funktionieren ist kein Fehler für dich? Du hast mit deiner "Variante" einfach nur einen Compilezeitfehler gegen einen Laufzeitfehler eingetauscht. Schlechter Tausch. Ein Fehler, der gemeldet wird, sollte dir lieber sein als einer, der nicht gemeldet wird.


Anmelden zum Antworten