119 votes

Que signifie le sigle LPCWSTR et comment le manipuler ?

Tout d'abord, qu'est-ce que c'est exactement ? Je suppose que c'est un pointeur (LPC signifie long pointer constant), mais que signifie "W" ? Est-ce un pointeur spécifique vers une chaîne de caractères ou un pointeur vers une chaîne de caractères spécifique ? Par exemple, je veux 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 puisque 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 me suis encore plus embrouillé. Sur le site msdn FindWindowEx est déclaré comme

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

Donc le dernier paramètre est LPCSTR, et le compilateur exige sur LPCWSTR. Veuillez m'aider.

175voto

JaredPar Points 333733

LPCWSTR signifie "Long Pointer to Constant Wide String". Le W est l'abréviation de Wide (large) et signifie que la chaîne est stockée dans un caractère de 2 octets au lieu de la normale. char . Commun à tout code C/C++ qui doit traiter des chaînes de caractères non ASCII uniquement.

Pour obtenir une chaîne littérale C normale à assigner à un fichier LPCWSTR vous devez le préfixer avec L

LPCWSTR a = L"TestWindow";

18voto

Matt Joiner Points 29194

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

Vous pouvez assigner à LPCWSTR en ajoutant un L à une chaîne littérale : LPCWSTR *myStr = L"Hello World";

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

7voto

Jerry Coffin Points 237758

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

Comme il s'agit d'une chaîne large, vous voulez que votre constante ressemble à : L"TestWindow" . Je ne créerais pas l'intermédiaire a soit, je passerais juste L"TestWindow" pour le paramètre :

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

Si vous voulez être pédant, un "LPCTSTR" est une chaîne "texte" -- une chaîne large dans une version Unicode et une chaîne étroite dans une version ANSI, vous devez donc utiliser la macro appropriée :

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

Peu de gens se soucient de produire du code qui peut être compilé à la fois pour les jeux de caractères Unicode et ANSI, et si ce n'est pas le cas, le faire fonctionner correctement peut représenter un travail supplémentaire pour un gain minime. Dans ce cas particulier, il n'y a pas beaucoup de travail supplémentaire, mais si vous manipulez des chaînes de caractères, il y a tout un ensemble de macros de manipulation de chaînes de caractères qui se résolvent dans les fonctions correctes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X