Hilfe mit CopyFile



  • Ich hab ein Problem mit der CopyFile Funktion. Selbst wenn ich versuche sie ganz simpel ohne Variablen einzusetzen wirft mein Compiler einen Fehler aus.

    CopyFile ("C:\\Ordner1\\datei.dat", "C:\\Ordner2\\datei.dat", TRUE)
    
    error C2664: 'CopyFileW': Konvertierung des Parameters 1 von 'const char [21]' in 'LPCWSTR' nicht möglich
    Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.
    

    Warum ist die Konvertierung nicht möglich? Habe ich da was falsch gemacht, oder muss ich vielleicht noch etwas im Compiler einstellen?

    Wäre nett wenn ihr mir helfen könntet



  • Strings werden in der WinAPI nicht mehr als einfache einbytige C-Strings dargestellt. Im Sinne der Internationalisierung sind 255 verschiedene Zeichen einfach nicht genug und es wird der Unicode-Standard mit 2 Bytes pro Zeichen verwendet.

    Der C++-Standard kennt zwar solche Zeichen inzwischen (wchar_t), verwendet sie aber nicht implizit. Du hast also drei Möglichkeiten:

    a) Du schaltest im Compiler in den Projekteigenschaften auf "ANSI-Zeichensatz verwenden" um. Dann wird CopyFile nicht mehr zu CopyFileW sondern zu CopyFileA und dein Beispiel funktioniert - ist aber altmodisch und nicht für Internationalisierung geeignet.

    b) Du wandelst deine Strings in Wide-Character-Strings um, bei statischen Strings ist das sogar sehr einfach:

    #include <tchar.h>
    #include <windows.h>
    ...
    
    CopyFile( TEXT("..."), TEXT("..."), TRUE);
    

    c) Du verwendest gefälligst auch Unicode in deinem Programm (beste Lösung). Je nach Compilerswitch wird aus TCHAR automatisch CHAR oder WCHAR. Das heißt für dich: Überall wo du bisher CHAR verwendest hast gehört ab jetzt TCHAR, überall wo statische Strings zu finden sind benötigst du das TEXT()-Makro, und Funktionen aus der Standardbibliothek heißen ab jetzt anders: Aus strcpy() wird tcscpy(), etc.

    MfG SideWinder



  • c) Du verwendest gefälligst auch Unicode in deinem Programm (beste Lösung). Je nach Compilerswitch wird aus TCHAR automatisch CHAR oder WCHAR. Das heißt für dich: Überall wo du bisher CHAR verwendest hast gehört ab jetzt TCHAR, überall wo statische Strings zu finden sind benötigst du das TEXT()-Makro, und Funktionen aus der Standardbibliothek heißen ab jetzt anders: Aus strcpy() wird tcscpy(), etc.

    Also ich bin absoluter programmier Neuling(Vorkenntnisse beziehen sich auf den normalen Anfänger Buch Stoff) und verstehe nicht so wirklich was das bedeuten soll.
    Ich habe bisher nie CHAR verwendet, nur eben den kleingeschriebenen char Datentyp.
    Was ist dieses CHAR, wie verwendet man das? Und was hat es mit TCHAR und WCHAR auf sich?



  • Hat dir SideWinder alles schon erklärt. Lies nochmal genauer.

    sizeof(CHAR) = sizeof(char) = 1
    sizeof(WCHAR) = 2
    sizeof(TCHAR) = [kommt drauf an, ob UNICODE definiert ist, d.h. ob irgendwo "#define UNICODE" steht]



  • Hat dir SideWinder alles schon erklärt. Lies nochmal genauer.

    Ich habe das so verstanden das ich anstatt char als Datentyp TCHAR benutzen soll, um dem Unicode Standard gerecht zu werden. Aber wenn ich als Datentyp TCHAR verwende gibt der Compiler einen Fehler aus. Daher dachte ich mir das ich es wohl nicht richtig verstehe. Da kann ich so oft lesen wie ich will, für mich will sich aus diesem Text kein anderer Sinn erschließen.



  • Auch wenn mir auf den oberen Beitrag niemand geantwortet hat wäre es nett wenn mir bei meinem nächsten Problem geholfen wird.
    Ich habe ein Problem damit meine Strings in LPCWSTR zu ändern wie es von der CopyFile() verlangt wird. Hab schon bei Google gesucht und in der MSDN, aber die meisten Texte verstehe ich nicht. Also falls möglich wäre eine verständliche und simpel erklärte Antwort nett.



  • Hat SideWinder doch schon geschrieben:

    CopyFile (TEXT("C:\\Ordner1\\datei.dat"), TEXT("C:\\Ordner2\\datei.dat"), TRUE);

    TEXT ist ein Makro und weist den Compiler an, je nach Einstellung (Ansi oder Unicode) entweder 1-Byte- oder 2-Byte-Unicode-Strings zu erzeugen.



  • Ich hab mich undeutlich ausgedrückt. Ich meinte wenn ich eine Variable mit dem Datentyp string hab. Da kann ich dieses TEXT() nicht benutzen sondern muss auf LPCWSTR casten oder sonstwas. Nur wie ich des hin bekomme ist mir ein Rätsel.



  • Wenn Du einen Ansi-String nach Unicode konvertieren möchtest:
    WinApi-Funktion "MultiByteToWideChar".



  • Und wie benutz ich des jetzt? Was da in der MSDN steht bringt mich kein stück weiter. Woher soll ich wissen welche flags ich zu benutzen hab?
    Ich bekomme vom Compiler nur diese Meldung wenn ich versuche die Funktion zu benutzen.

    error C2664: 'MultiByteToWideChar': Konvertierung des Parameters 3 von 'std::string' in 'LPCSTR' nicht möglich
    Kein benutzerdefinierter Konvertierungsoperator verfügbar, der diese Konvertierung durchführen kann, oder der Operator kann nicht aufgerufen werden
    


  • das mit dem TCAHR sollte in etwa so aussehen:

    const TCHAR* path="C:\\abc.txt";
    const TCHAR* newpath="C:\\Programme\\abc.txt";
    CopyFile(path, newpath, TRUE);
    

    allerdings solltest du dann noch <tchar.h> includieren und anstatt main() _tmain() verwenden.



  • Kann ich dann einfach eine string variable in ein TCHAR casten und in der AutoCopy Funktion benutzen? Ich frage weils bei mir nicht geklappt hat, aber aus Erfahrung weis ich das das nichts zu sagen hat.



  • Eisbehr schrieb:

    Und wie benutz ich des jetzt? Was da in der MSDN steht bringt mich kein stück weiter. Woher soll ich wissen welche flags ich zu benutzen hab?
    Ich bekomme vom Compiler nur diese Meldung wenn ich versuche die Funktion zu benutzen.

    error C2664: 'MultiByteToWideChar': Konvertierung des Parameters 3 von 'std::string' in 'LPCSTR' nicht möglich
    Kein benutzerdefinierter Konvertierungsoperator verfügbar, der diese Konvertierung durchführen kann, oder der Operator kann nicht aufgerufen werden
    

    Verwende die Methode c_str(), um aus einem std::string/std::wstring-Objekt einen C-String zu machen. Da brauchste nix konvertieren.

    $noopy schrieb:

    das mit dem TCAHR sollte in etwa so aussehen:

    const TCHAR* path="C:\\abc.txt";
    const TCHAR* newpath="C:\\Programme\\abc.txt";
    CopyFile(path, newpath, TRUE);
    

    Pappalapapp, so sieht das aus:

    const TCHAR szPath[] = TEXT("C:\\abc.txt");
    const TCHAR szNewPath[] = TEXT("C:\\Programme\\abc.txt");
    CopyFile(szPath, szNewPath, TRUE);
    

    Oder, hier sinnvoller: Du gibst die Pfade direkt mit dem TEXT-Makro in der Funktion an...so wie es hier auch schon vorher x-Mal geschrieben wurde 😞 .



  • CodeFinder schrieb:

    Verwende die Methode c_str(), um aus einem std::string/std::wstring-Objekt einen C-String zu machen. Da brauchste nix konvertieren.

    Nix konvertieren heißt ich brauche kein "MultiByteToWideChar" oder das verwenden von blub.c_str() schmeisst keine Fehlermeldug mehr aus?

    Mein Problem ist ja das ich eine string variable habe (aus Datei ausgelesen) und damit die CopyFile füttern will. Vielleicht hilfts mir wenn ihr da mal ein Konkretes Beispiel dazu bringt.
    Bei blanken Erklärungen versteh ich irgendwie immer nur Bahnhof.

    MfG
    Eisbehr



  • Eisbehr schrieb:

    oder das verwenden von blub.c_str() schmeisst keine Fehlermeldug mehr aus?

    So ist es.

    Eisbehr schrieb:

    Mein Problem ist ja [...]

    Ähm, das ist doch kein Problem ?! ... Also wenn Dein Programm mit UNICODE arbeitet, dann verwende auch entsprechend überall UNICODE-Anweisungen (Beispiel std::wstring statt std::string) und Du hast keine Probleme. Vllt ist es auch anfangs einfacher UNICODE erstmal zu deaktivieren.



  • Wenn der Fragesteller einen ANSI-String aus einer Datei liest und als UNICODE weiter verarbeiten möchte, wird er den String schon irgendwo konvertieren müssen - eben mit "MultiByteToWideChar".



  • mmm schrieb:

    Wenn der Fragesteller einen ANSI-String aus einer Datei liest und als UNICODE weiter verarbeiten möchte, wird er den String schon irgendwo konvertieren müssen - eben mit "MultiByteToWideChar".

    Siehe meinen letzten Satz im voherigen Post, hängt halt davon ab, welchen Zeichensatz er letztendlich verwendet. In Deinem Fall muss er konvertieren, klar 😉 .


Log in to reply