Wofür steht LPCWSTR und wie soll damit umgegangen werden?

89

Was ist das genau? Ich denke, es ist ein Zeiger (LPC bedeutet lange Zeigerkonstante), aber was bedeutet "W"? Ist es ein bestimmter Zeiger auf eine Zeichenfolge oder ein Zeiger auf eine bestimmte Zeichenfolge? Zum Beispiel möchte ich ein Fenster mit dem Namen "TestWindow" schließen.

HWND g_hTest;
LPCWSTR a;
*a = ("TestWindow");
g_hTest = FindWindowEx(NULL, NULL, NULL, a);
DestroyWindow(g_hTest);

Der Code ist illegal und funktioniert nicht, da const char [6] nicht in CONST WCHAR konvertiert werden kann. Ich verstehe es überhaupt nicht. Ich möchte ein klares Verständnis all dieser LPCWSTR, LPCSTR, LPSTR erhalten. Ich habe versucht, etwas zu finden, war aber noch mehr verwirrt. Bei msdn wird site FindWindowExals deklariert

HWND FindWindowEx(      
    HWND hwndParent,
    HWND hwndChildAfter,
    LPCTSTR lpszClass,
    LPCTSTR lpszWindow
);

Der letzte Parameter ist also LPCSTR, und der Compiler fordert LPCWSTR. Bitte helfen Sie.

lhj7362
quelle
58
Willkommen in der ungarischen Microsoft-Notation.
Thomas Matthews
2
es macht tatsächlich für viel besser lesbare Dokumentation, schade alles andere darüber sux.
Matt Joiner
1
@Thomas: Dies ist nicht das, was Microsoft (oder Simonyi) ursprünglich als ungarische Notation bezeichnet hat . Es ist mehr oder weniger das Ergebnis eines Unfalls, als die Dokumentationsgruppe beschloss, einige Verbesserungen der "Lesbarkeit" vorzunehmen. Sie waren keine Entwickler und folglich waren die Änderungen nicht anmutig. Hintergrundinformationen sind in der Hugarian-Notation
bin
@ IInspectable: Defekter Link
Nicolas Raoul
1
@ IInspectable: Arbeitslink ist blogs.msdn.microsoft.com/larryosterman/2004/06/22/…
Julius Bullinger

Antworten:

134

LPCWSTRsteht für "Long Pointer to Constant Wide String". Das W steht für Wide und bedeutet, dass die Zeichenfolge in einem 2-Byte-Zeichen gegenüber der Normalen gespeichert ist char. Gemeinsam für jeden C / C ++ - Code, der nur Nicht-ASCII-Zeichenfolgen verarbeiten muss. =

Um eine normale C-Literalzeichenfolge zu erhalten, die einem zugewiesen werden soll LPCWSTR, müssen Sie ihr das Präfix L voranstellen

LPCWSTR a = L"TestWindow";
JaredPar
quelle
8
Nur zum Erweitern - der 'LONG'-Teil ist ein Kater aus 16-Bit-Fenstern und kann ignoriert werden (außer, Sie brauchen ihn im Namen)
Martin Beckett
14
"Kater von 16bit Windows" - das ist sicher!
John Dibling
4
Nein, es ist richtig. Es war und ist ein 32-Bit-Zeiger. Es gibt keine "kurzen" 16-Bit-Zeiger mehr, sodass Sie sich beschweren können, wenn Sie einen finden SPCWSTR.
MSalters
50
Mein Gott. L ??? Der Buchstabe L? Nicht einmal eine Funktion, L ()? Einfach nur L? Wer zum Teufel hat sich das ausgedacht?
John Ktejik
12
@ user396483 In vielen Sprachen ist es üblich, Konstanten Präfixe und Suffixe hinzuzufügen, um ihre Darstellung zu ändern, ohne ihre Bedeutung für einen Menschen zu ändern. Zum Beispiel ist 36ULin C # dasselbe wie (ulong)36(ulong ist eine vorzeichenlose 64-Bit-Ganzzahl). @kann in derselben Sprache wie ein Präfix für Zeichenfolgen verwendet werden, wodurch sich die Art und Weise ändert, in der sie leicht analysiert werden.
Zenexer
12

LPCWSTRist äquivalent zu wchar_t const *. Es ist ein Zeiger auf eine breite Zeichenfolge, die vom Funktionsaufruf nicht geändert wird.

Sie können LPCWSTRs zuweisen, indem Sie einem Zeichenfolgenliteral ein L voranstellen:LPCWSTR *myStr = L"Hello World";

LPC T STR und alle anderen T- Typen verwenden abhängig von den Unicode-Einstellungen für Ihr Projekt einen Zeichenfolgentyp. Wenn _UNICODEfür Ihr Projekt definiert, entspricht die Verwendung von T-Typen den breiten Zeichenformularen, ansonsten den Ansi-Formularen. Die entsprechende Funktion wird auch folgendermaßen aufgerufen: FindWindowExwird als FindWindowExAoder FindWindowExWabhängig von dieser Definition definiert.

Matt Joiner
quelle
7

Es ist ein langer Zeiger auf eine konstante, breite Zeichenfolge (dh eine Zeichenfolge mit breiten Zeichen).

Da es sich um eine breite Zeichenfolge handelt, möchten Sie Ihre Konstante wie folgt aussehen lassen : L"TestWindow". Ich würde auch kein Zwischenprodukt erstellen, sondern anur L"TestWindow"den Parameter übergeben:

ghTest = FindWindowEx(NULL, NULL, NULL, L"TestWindow");

Wenn Sie pedantisch korrekt sein möchten, ist ein "LPCTSTR" eine "Text" -String - eine breite Zeichenfolge in einem Unicode-Build und eine schmale Zeichenfolge in einem ANSI-Build. Verwenden Sie daher das entsprechende Makro:

ghTest = FindWindow(NULL, NULL, NULL, _T("TestWindow"));

Nur wenige Leute interessieren sich für die Erstellung von Code, der sowohl für Unicode- als auch für ANSI-Zeichensätze kompiliert werden kann. In diesem speziellen Fall gibt es nicht viel zusätzliche Arbeit, aber wenn Sie Zeichenfolgen bearbeiten, gibt es eine ganze Reihe von Zeichenfolgenmanipulationsmakros, die in die richtigen Funktionen aufgelöst werden.

Jerry Sarg
quelle
1
Sie müssen nicht pedantisch korrekt sein. Verwenden Sie _T (), wenn Sie Konstanten wie _T (MAIN_WINDOW) verwenden. Andernfalls schlägt LMAIN_WINDOW fehl.
Rodolfo