Cosa significa LPCWSTR e come dovrebbe essere gestito?


91

Prima di tutto, cos'è esattamente? Immagino sia un puntatore (LPC significa costante puntatore lungo), ma cosa significa "W"? È un puntatore specifico a una stringa o un puntatore a una stringa specifica? Ad esempio, voglio chiudere una finestra denominata "TestWindow".

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

Il codice è illegale e non funziona poiché const char [6] non può essere convertito in CONST WCHAR. Non lo capisco affatto. Voglio avere una chiara comprensione di tutti questi LPCWSTR, LPCSTR, LPSTR. Ho provato a trovare qualcosa, ma mi sono confuso ancora di più. In msdn il sito FindWindowExè dichiarato come

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

Quindi l'ultimo parametro è LPCSTR e il compilatore richiede LPCWSTR. Per favore aiuto.


59
Benvenuto nella notazione ungherese di Microsoft.
Thomas Matthews,

2
in realtà rende la documentazione molto più leggibile, peccato per tutto il resto sux.
Matt Joiner

1
@Thomas: Questo non è ciò che Microsoft (o Simonyi per quella materia) ha inizialmente etichettato con notazione ungherese . È più o meno il risultato di un incidente, quando il gruppo di documentazione ha deciso di esercitare alcuni miglioramenti di "leggibilità". Non erano sviluppatori e di conseguenza le modifiche non sono state graziose. Le informazioni di base sono disponibili in notazione Hugarian - ora tocca a me :)
IInspectable

@IInspectable: collegamento interrotto
Nicolas Raoul

1
@IInspectable: il collegamento di lavoro è blogs.msdn.microsoft.com/larryosterman/2004/06/22/…
Julius Bullinger

Risposte:


137

LPCWSTRsta per "Long Pointer to Constant Wide String". La W sta per Wide e significa che la stringa è memorizzata in un carattere di 2 byte rispetto al normale char. Comune per qualsiasi codice C / C ++ che ha a che fare con stringhe solo non ASCII. =

Per ottenere una normale stringa letterale C da assegnare a a LPCWSTR, è necessario anteporla a L

LPCWSTR a = L"TestWindow";

8
Solo per espandere - la parte "LUNGA" è un postumi di una sbornia da finestre a 16 bit e può essere ignorata (eccetto che ne hai bisogno nel nome)
Martin Beckett,

14
"Postumi di una sbornia da Windows a 16 bit" - Questo è certo!
John Dibling,

4
No, è corretto. Era ed è un puntatore a 32 bit. Non ci sono più puntatori "brevi" a 16 bit, quindi potresti lamentarti se riesci a trovare un file SPCWSTR.
MSalters

50
Mio Dio. L ??? La lettera L? Nemmeno una funzione, L ()? Semplicemente L? Chi diavolo l'ha inventato ??
john ktejik

12
@ user396483 È comune in molte lingue aggiungere prefissi e suffissi alle costanti per cambiare il modo in cui vengono rappresentate, senza cambiare il loro significato in un essere umano. Ad esempio, 36ULin C # è uguale a (ulong)36(ulong è un intero a 64 bit senza segno). @può essere utilizzato nella stessa lingua del prefisso per le stringhe, cambiando leggermente il modo in cui vengono analizzate.
Zenexer

12

LPCWSTRè equivalente a wchar_t const *. È un puntatore a una stringa di caratteri ampia che non verrà modificata dalla chiamata alla funzione.

Puoi assegnare a LPCWSTRs anteponendo una L a una stringa letterale:LPCWSTR *myStr = L"Hello World";

LPC T STR e qualsiasi altro tipo T , accetta un tipo di stringa a seconda delle impostazioni Unicode per il progetto. Se _UNICODEè definito per il tuo progetto, l'uso dei tipi T è lo stesso delle forme a caratteri larghi, altrimenti le forme Ansi. La funzione appropriata sarà anche chiamata in questo modo: FindWindowExè definita come FindWindowExAo FindWindowExWdipende da questa definizione.


7

È un puntatore lungo a una stringa ampia e costante (cioè una stringa di caratteri larghi).

Dal momento che è una stringa di larghezza, si vuole rendere il vostro look costante come: L"TestWindow". Non creerei nemmeno l'intermedio a, passerei solo L"TestWindow"per il parametro:

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

Se vuoi essere pedanticamente corretto, un "LPCTSTR" è una stringa di "testo": una stringa larga in una build Unicode e una stringa stretta in una build ANSI, quindi dovresti usare la macro appropriata:

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

Tuttavia, poche persone si preoccupano di produrre codice che può essere compilato sia per i set di caratteri Unicode che per quelli ANSI, e se non riesci a farlo funzionare correttamente può essere un bel po 'di lavoro extra per poco guadagno. In questo caso particolare, non c'è molto lavoro extra, ma se stai manipolando stringhe, c'è un intero set di macro per la manipolazione di stringhe che risolvono le funzioni corrette.


1
non hai bisogno di essere pedanticamente corretto, usa _T () se stai usando costanti come _T (MAIN_WINDOW) altrimenti LMAIN_WINDOW fallirà.
Rodolfo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.