Que signifie LPCWSTR et comment doit-il être géré?

91

Tout d'abord, qu'est-ce que c'est exactement? Je suppose que c'est un pointeur (LPC signifie une constante de pointeur long), mais que signifie "W"? Est-ce un pointeur spécifique vers une chaîne ou un pointeur vers une chaîne spécifique? Par exemple, je souhaite fermer une fenêtre nommée "TestWindow".

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

Le code est illégal et il ne fonctionne pas car const char [6] ne peut pas être converti en CONST WCHAR. Je ne comprends pas du tout. Je veux avoir une compréhension claire de tous ces LPCWSTR, LPCSTR, LPSTR. J'ai essayé de trouver quelque chose, mais je suis devenu encore plus confus. Au site msdn FindWindowExest déclaré comme

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

Le dernier paramètre est donc LPCSTR et le compilateur demande à LPCWSTR. Veuillez aider.

lhj7362
la source
59
Bienvenue dans la notation hongroise de Microsoft.
Thomas Matthews
2
cela rend en fait une documentation beaucoup plus lisible, dommage pour tout le reste sux.
Matt Joiner
1
@Thomas: Ce n'est pas ce que Microsoft (ou Simonyi d'ailleurs) a initialement étiqueté Notation hongroise . C'est plus ou moins le résultat d'un accident, lorsque le groupe de documentation a décidé d'exercer des améliorations de «lisibilité». Ce n'étaient pas des développeurs et par conséquent les changements n'étaient pas gracieux. Informations générales est disponible à la notation de la Hongrie ne - c'est mon tour :)
IInspectable
@IInspectable: Lien brisé
Nicolas Raoul
1
@IInspectable: Le lien de travail est blogs.msdn.microsoft.com/larryosterman/2004/06/22/…
Julius Bullinger

Réponses:

137

LPCWSTRsignifie "Long Pointer to Constant Wide String". Le W signifie Wide et signifie que la chaîne est stockée dans un caractère de 2 octets par rapport à la normale char. Commun pour tout code C / C ++ qui doit traiter uniquement des chaînes non ASCII. =

Pour obtenir une chaîne littérale C normale à affecter à a LPCWSTR, vous devez la préfixer avec L

LPCWSTR a = L"TestWindow";
JaredPar
la source
8
Juste pour développer - la partie `` LONG '' est une gueule de bois de fenêtres 16 bits et peut être ignorée (sauf si vous en avez besoin dans le nom)
Martin Beckett
14
"gueule de bois de Windows 16 bits" - C'est sûr!
John Dibling
4
Non, c'est correct. C'était et c'est toujours un pointeur 32 bits. Il n'y a plus de pointeurs 16 bits "courts", vous pourriez donc vous plaindre si vous parvenez à trouver un fichier SPCWSTR.
MSalters
50
Mon Dieu. L ??? La lettre L? Pas même une fonction, L ()? Tout simplement L? Qui diable a inventé ça ??
john ktejik
12
@ user396483 Il est courant dans de nombreuses langues d'ajouter des préfixes et des suffixes aux constantes pour changer la façon dont elles sont représentées, sans changer leur signification pour un humain. Par exemple, 36ULen C # est identique à (ulong)36(ulong étant un entier 64 bits non signé). @peut être utilisé dans la même langue comme préfixe pour les chaînes, en modifiant légèrement la façon dont elles sont analysées.
Zenexer
12

LPCWSTRéquivaut à wchar_t const *. C'est un pointeur vers une chaîne de caractères large qui ne sera pas modifiée par l'appel de fonction.

Vous pouvez affecter à LPCWSTRs en ajoutant un L à un littéral de chaîne:LPCWSTR *myStr = L"Hello World";

LPC T STR et tout autre type T , prenez un type de chaîne en fonction des paramètres Unicode de votre projet. Si _UNICODEest défini pour votre projet, l'utilisation des types T est la même que les formes de caractères larges, sinon les formes Ansi. La fonction appropriée sera également appelée de cette manière: FindWindowExest définie comme FindWindowExAou en FindWindowExWfonction de cette définition.

Matt Joiner
la source
7

C'est un long pointeur vers une chaîne large et constante (c'est-à-dire une chaîne de caractères larges).

Comme il est une grande chaîne, vous voulez rendre votre constante comme: L"TestWindow". Je ne créerais pas non plus l'intermédiaire a, je passerais juste L"TestWindow"pour le paramètre:

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

Si vous voulez être pédantiquement correct, un «LPCTSTR» est une chaîne de «texte» - une chaîne large dans une construction Unicode et une chaîne étroite dans une construction ANSI, vous devez donc utiliser la macro appropriée:

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

Cependant, peu de gens se soucient de produire du code capable de compiler à la fois pour les jeux de caractères Unicode et ANSI, et si vous ne le faites pas vraiment fonctionner correctement, cela peut être un peu plus de travail pour peu de gain. Dans ce cas particulier, il n'y a pas beaucoup de travail supplémentaire, mais si vous manipulez des chaînes, il existe tout un ensemble de macros de manipulation de chaînes qui se résolvent aux fonctions correctes.

Jerry Coffin
la source
1
vous n'avez pas besoin d'être pédantiquement correct, utilisez _T () si vous utilisez des constantes comme _T (MAIN_WINDOW) sinon LMAIN_WINDOW échouera.
Rodolfo