web-dev-qa-db-fra.com

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

Tout d’abord, c’est quoi au juste? Je suppose que c'est un pointeur (LPC signifie longue constante), mais que signifie "W"? S'agit-il d'un pointeur spécifique sur une chaîne ou d'un pointeur sur une chaîne 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 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 j'ai été encore plus confus. 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 demande à LPCWSTR. S'il vous plaît aider.

76
lhj7362

LPCWSTR signifie "Pointeur long sur une chaîne large et constante". 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 des chaînes non-ASCII uniquement. =

Pour qu'une chaîne de littéral C normale soit affectée à un LPCWSTR, vous devez la préfixer par L

LPCWSTR a = L"TestWindow";
117
JaredPar

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

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

LPCTSTR et tout autre type T , prenons un type de chaîne en fonction des paramètres Unicode de votre projet. Si _UNICODE est défini pour votre projet, l’utilisation des types T est identique à celle des formes à caractères larges, sinon celle des formes Ansi. La fonction appropriée sera également appelée de cette façon: FindWindowEx est défini comme FindWindowExA ou FindWindowExW en fonction de cette définition.

10
Matt Joiner

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

Comme c'est une chaîne large, vous voulez que votre constante ressemble à ceci: L"TestWindow". Je ne créerais pas l'intermédiaire a non plus, je passerais juste L"TestWindow" pour le paramètre:

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

Si vous voulez être correct sur le plan pédagogique, un "LPCTSTR" est une chaîne "text" - 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 fonctionner correctement, vous risquez un peu plus de travail supplémentaire pour un gain minime. Dans ce cas particulier, il y a peu de travail supplémentaire à faire, mais si vous manipulez des chaînes, il existe tout un ensemble de macros de manipulation de chaînes qui se résolvent en fonctions correctes.

6
Jerry Coffin