Problem mit 'LPCWSTR'
-
Unter VC++2005:
#include <windows.h> int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MessageBox(NULL, "Goodbye, cruel world!", "Note", MB_OK); return 0; }kriege ich:
Error 1 error C2664: 'MessageBoxW' : cannot convert parameter 2 from 'const char [22]' to 'LPCWSTR' c:\documents and settings\zdravko\my documents\visual studio 2005\projects\mda_test2\mda_test2\main_mda.cpp 6
Warum?
-
Mach einfach
L"bla"für eine UNICODE-Zeichenkette
-
Danke! :p
-
Besser ist die Verwendung des TEXT (windows.h) bzw. _T(tchar.h)-Makros.
-
Ja, ich verwände in zwischen eigentlich auch nur noch das TEXT("blubb") Makro

Aber diese unglaublich vielen verschiedenen Typen nerven irgendwie:
PSTR, LPSTR, LPCSTR, LPCTSTR, LPWSTR usw.Wozu gibt es überhaupt so viele verschiedene Typen?
Kann es sein dass einiges davon aus den Win16-Bit-Versionen stammt und bis heute mitgeschleppt wird?
-
LukasBanana schrieb:
Ja, ich verwände in zwischen eigentlich auch nur noch das TEXT("blubb") Makro


LukasBanana schrieb:
Aber diese unglaublich vielen verschiedenen Typen nerven irgendwie:
PSTR, LPSTR, LPCSTR, LPCTSTR, LPWSTR usw.Wozu gibt es überhaupt so viele verschiedene Typen?
Kann es sein dass einiges davon aus den Win16-Bit-Versionen stammt und bis heute mitgeschleppt wird?Hm also es gibt mittlerweile keine (n Unterschied zwischen ) LONG-Pointer bzw. FAR-Pointer. Deshalb ist PSTR und LPSTR das gleiche, also char* - immer
. LPCSTR ist das ganze in const. Alle diese Typen sind aber nur für den ANSI-Zeichensatz. LPCTSTR ist ANSI/UNICODE, je nach aktivierten Zeichensatz. LPWSTR ist nur UNICODE, also wchar_t*.Falls Du die Namen auflösen willst, musst Du Dir nur merken: LP bzw. P steht immer für ein Zeigertyp, STR immer für einen C-String-Datentyp. Ein W dazwischen kennzeichnet UNICODE-Strings (also wchar_t, 'w' für 'wide-strings' -> 'breite Zeichenketten'), ist dieses nicht vorhanden ist es ein ANSI-String (also char). Befindet sich noch ein C in der Typendefinition ist das Schlüsselwort const mit im Spiel. Es handelt sich also in der Regel um einen konstanten Zeiger. Ist das T mit im Typennamen enthalten (dann kann kein W enthalten sein), handelt es sich um einen Typ, der sich dem aktuell-definierten Zeichensatz anpasst (Je nachdem, ob das UNICODE-Makro definiert ist).
Noch ein Tipp: Verwende einfach immer den Datentyp TCHAR und das TEXT-Makro. Wenn Du einen Zeiger auf TCHAR (also char oder wchar_t) brauchst, schreib einfach TCHAR*. Muss es konstant sein, schreibe: const TCHAR*. Damit ist es übersichtlich, Zeichensatz-unabhängig und eindeutig
.