cannot convert parameter 1 from 'const char *' in 'LPCWSTR'
Grundsätzlich habe ich einige einfache code, einige Dinge für Dateien und ich versuche die Portierung auf windows. Ich habe etwas, das aussieht wie dieses:
int SomeFileCall(const char * filename){
#ifndef __unix__
SomeWindowsFileCall(filename);
#endif
#ifdef __unix__
/**** Some unix only stat code here! ****/
#endif
}
die Linie SomeWindowsFileCall(filename);
bewirkt, dass der compiler Fehler:
cannot convert parameter 1 from 'const char *' to 'LPCWSTR'
Wie behebe ich dieses Problem ohne eine änderung der SomeFileCall
Prototyp?
LPCWSTR
ist const wchar_t *
- das ist eine wide-character-string.Siehe Arbeiten mit Strings für weitere details.
mögliche Duplikate von cannot convert parameter 1 from 'char *' in 'LPCWSTR'
InformationsquelleAutor john-charles | 2012-05-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Meisten Windows-APIs auf, die strings haben zwei Versionen: eine, die
char *
und eine, dieWCHAR *
(das letztere entsprichtwchar_t *
).SetWindowText
, zum Beispiel, ist eigentlich ein makro, das expandiert, um entwederSetWindowTextA
(das dauertchar *
) oderSetWindowTextW
(das dauertWCHAR *
).In Ihrem Projekt, es klingt wie alle diese Makros sind, verweisen auf die -W-Versionen. Dies wird gesteuert durch die
UNICODE
Präprozessor-makro (die definiert ist, wenn Sie die Option "Use Unicode Character Set" die option "Projekt" in Visual Studio). (Einige von Microsoft C und C++ run time library-Funktionen haben auch ANSI-und wide-Versionen. Welche Sie erhalten ist ausgewählt von dem ähnlich benannten_UNICODE
makro, das definiert ist durch das Visual Studio-Projekt-Einstellung.)In der Regel, sowohl von den-A-und -W-Funktionen vorhanden sind, die in den Bibliotheken zur Verfügung und sind, auch wenn die Anwendung kompiliert wird für Unicode. (Es gibt Ausnahmen; einige neuere Funktionen sind nur verfügbar in der "wide" - Versionen.)
Wenn Sie eine
char *
mit dem text in die richtige ANSI-code Seite, die Sie aufrufen können-Eine version, die explizit (z.B.SetWindowTextA
). Die A-Versionen in der Regel Wrapper, machen wide-character-Kopien der string-Parameter und die Kontrolle an die -W-Versionen.Alternative ist, um Ihre eigenen wide-character-Kopien des strings. Sie können dies tun, mit MultiByteToWideChar. Aufrufen es kann schwierig sein, weil Sie zu bewältigen haben, die Puffer. Wenn man bekommen kann Weg mit Aufruf der -A-version direkt, das ist in der Regel einfacher und auch schon getestet. Aber wenn Ihr
char *
string ist UTF-8 oder jeder anderen Codierung als der aktuellen ANSI-Codepage, die Sie tun sollten, die Umstellung selbst.Bonus Info
Den -suffix steht für "ANSI", die die üblichen Windows-Begriff für einen single-byte-Codepage-Zeichensatz.
Das -W-suffix steht für "Wide" (also die encoding-Einheiten sind größer als ein einzelnes byte). Insbesondere Windows verwendet little-endian UTF-16-für große Zeichenfolgen. In der MSDN-Dokumentation ruft einfach diese "Unicode", das ist ein wenig irreführend.
ReadDirectoryChangesW
.Yep,
CommandLineToArgvW
ist eine andere. Auch ist offensichtlich Windows-CE - nur hat die W-Versionen der meisten (alle?) Funktionen um die Codegröße zu verringern, obwohl zugegeben nicht allzu viele Menschen Ziel-Windows-CE in diesen Tagen.Aufruf der
-A
version ist vielleicht einfacher, aber es verwendet die "ANSI" - code-Seite. Also, wenn Ihr code verwendet UTF-8 für strings, die Sie haben zu konvertieren sowieso. Und Sie werden nicht in der Lage, Dateien zu öffnen, mit nicht-ANSI-Zeichen in Ihre Namen.InformationsquelleAutor Adrian McCarthy
Konfigurieren Sie Ihr Projekt für die Verwendung von ANSI-Zeichensatz. (Allgemein -> Character Set)
Was sind TCHAR, WCHAR, LPSTR, LPWSTR, LPCTSTR etc..
typedef const wchar_t* LPCWSTR;
InformationsquelleAutor Ruben
Bauen Sie mit WinApi im Unicode-Modus, so dass alle string-Parameter beheben zu wide-strings. Die einfachste Lösung wäre die änderung der WinApi ANSI, sonst müssen Sie erstellen eine
wchar_t*
mit dem Inhalt vonfilename
und verwenden, die als argument verwendet wird.InformationsquelleAutor K-ballo
nicht sicher, welchen compiler du verwendest, aber in visual studio können Sie die default char type, ob es UNICODE oder multibyte. In deinem Fall klingt es so, als wenn der UNICODE-Standard ist also die einfachste Lösung ist, überprüfen Sie den Schalter an Ihre speziellen compiler, der bestimmt, default char type, denn es würde sparen Sie einige arbeiten, sonst würden Sie am Ende hinzufügen von code, um hin und her konvertieren von UNICODE, die möglicherweise unnötig overhead-plus könnte eine zusätzliche Fehlerquelle.
InformationsquelleAutor Anders
Bin in der Lage, dies zu lösen, - Fehler durch einstellen der Zeichensatz auf "Use Multi-Byte Character set"
[Projekt-Eigenschaften-> Konfiguration-Eigenschaften -> allgemein -> Zeichen Setzen ->"Use Multi-Byte Character set"
InformationsquelleAutor Kishan