Quelle est la différence entre LPCSTR
, LPCTSTR
et LPTSTR
?
Pourquoi avons-nous besoin de faire cela pour convertir une chaîne en LV
/_ITEM
variable de structure pszText
:
LV_DISPINFO dispinfo;
dispinfo.item.pszText = LPTSTR((LPCTSTR)string);
Pour répondre à la première partie de votre question:
LPCSTR
est une chaîne de const
LPCTSTR
est un const TCHAR
chaîne, (TCHAR
étant soit un caractère large, soit un caractère selon que UNICODE est défini dans votre projet)
LPTSTR
est une chaîne (non-constante) TCHAR
C’est un excellent article de codeproject décrivant les chaînes C++ (voir 2/3 en bas pour un tableau comparant les différents types)
Rapide et sale:
LP
== L ong P ointer. Pensez simplement au pointeur ou au caractère *
C
= C onst, dans ce cas, je pense qu'ils signifient que la chaîne de caractères est une chaîne const, et non le pointeur étant const.
STR
est chaîne
le T
est pour un caractère large ou char (TCHAR) en fonction des options de compilation.
char
: caractère 8 bits - type de données C/C++ sous-jacentCHAR
: alias de char
- type de données WindowsLPSTR
: chaîne de CHAR
terminée par le caractère null ( [~ # ~] l [~ # ~] ong [~ # ~] p [~ # ~] ointer) LPCSTR
: chaîne constante de CHAR
terminée par le caractère null ( [~ # ~] l [~ # ~] ong [~ # ~] p [~ # ~] ointer) wchar_t
: Caractère 16 bits - type de données sous-jacent C/C++WCHAR
: alias de wchar_t
- Type de données WindowsLPWSTR
: chaîne de WCHAR
terminée par le caractère null ( [~ # ~] l [~ # ~] ong [~ # ~] p [~ # ~] ointer) LPCWSTR
: chaîne constante de WCHAR
terminée par le caractère null ( [~ # ~] l [~ # ~] ong [~ # ~] p [~ # ~] ointer) UNICODE
définirTCHAR
: alias de WCHAR
si UNICODE est défini; sinon CHAR
LPTSTR
: chaîne de TCHAR
terminée par le caractère null ( [~ # ~] l [~ # ~] ong [~ # ~] p [~ # ~] ointer) LPCTSTR
: chaîne constante de TCHAR
terminée par le caractère null ( [~ # ~] l [~ # ~] ong [~ # ~] p [~ # ~] ointer) Alors
| Item | 8-bit | 16-bit | Varies |
|-------------------|--------------|-------------|-----------------|
| character | CHAR | WCHAR | TCHAR |
| string | LPSTR | LPWSTR | LPTSTR |
| string (const) | LPCSTR | LPCWSTR | LPCTSTR |
TCHAR
→ Caract. Texte ( archive.is )
Ajoutant à la réponse de John et Tim.
Sauf si vous codez pour Win98, il n'y a que deux des 6 types de chaînes que vous devriez utiliser dans votre application.
LPWSTR
LPCWSTR
Les autres sont destinés à prendre en charge les plates-formes ANSI ou les compilations doubles. Celles-ci ne sont plus aussi pertinentes aujourd'hui qu'elles l'étaient.
Pour répondre à la deuxième partie de votre question, vous devez faire des choses comme
LV_DISPINFO dispinfo;
dispinfo.item.pszText = LPTSTR((LPCTSTR)string);
parce que la structure LVITEM
de MS a un LPTSTR
, c'est-à-dire un pointeur mutable , pas un LPCTSTR
. Ce que tu fais c'est
1) convertir string
(un CString
à une estimation) en un LPCTSTR
(ce qui signifie en pratique obtenir l'adresse de son tampon de caractères sous la forme d'un pointeur en lecture seule)
2) convertissez ce pointeur en lecture seule en un pointeur inscriptible en supprimant son const
ness.
Cela dépend de ce que dispinfo
est utilisé pour déterminer s’il existe ou non une chance que votre appel ListView
finisse par essayer de écrire à travers ce pszText
. Si c'est le cas, c'est potentiellement une très mauvaise chose: après tout, on vous a donné un pointeur en lecture seule, puis vous avez décidé de le traiter en écriture: il y a peut-être une raison pour laquelle il était en lecture seule!
Si vous travaillez avec CString
, vous avez la possibilité d’utiliser string.GetBuffer()
- pour vous donner délibérément un LPTSTR
enregistrable. Vous devez alors vous rappeler d'appeler ReleaseBuffer()
si la chaîne est modifiée. Ou vous pouvez allouer un tampon temporaire local et y copier la chaîne.
Cela sera inutile dans 99% des cas et traiter le LPCTSTR
comme un LPTSTR
fonctionnera ... mais un jour, quand on s'y attendra le moins ...