Quelle est la différence entre LPCSTR
, LPCTSTR
et LPTSTR
?
Pourquoi avons-nous besoin de faire cela pour convertir une chaîne en une variable LV
/ _ITEM
structure pszText
:
LV_DISPINFO dispinfo;
dispinfo.item.pszText = LPTSTR((LPCTSTR)string);
c++
windows
visual-c++
mfc
rienMaster
la source
la source
Réponses:
Pour répondre à la première partie de votre question:
LPCSTR
est un pointeur vers une chaîne const (LP signifie Long Pointer )LPCTSTR
est un pointeur vers uneconst TCHAR
chaîne, (TCHAR
étant un caractère large ou un caractère selon que UNICODE est défini dans votre projet)LPTSTR
est un pointeur vers uneTCHAR
chaîne (non-const)En pratique, lorsque nous en parlons dans le passé, nous avons laissé de côté l'expression «pointeur vers une» pour simplifier, mais comme mentionné par les courses de légèreté en orbite, ce sont toutes des pointeurs.
Ceci est un excellent article de projet de code décrivant les chaînes C ++ (voir 2/3 en bas pour un graphique comparant les différents types)
la source
extern "C"
. En dehors de cela, oui, il devrait certainement avoir besoin du bit "pointeur" ou d'une description spécifique sous forme de chaîne C.Rapide et sale:
LP
== L ong P ointer. Pensez juste 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 un const, pas le pointeur étant const.STR
est une chaînele
T
est pour un caractère large ou char (TCHAR) selon les options de compilation.la source
AnsiStrings 8 bits
char
: Caractère 8 bits - type de données C / C ++ sous-jacentCHAR
: alias dechar
- type de données WindowsLPSTR
: chaîne terminée par un zéro deCHAR
( L ong P ointer)LPCSTR
: chaîne constante terminée par un zéro deCHAR
( L ong P ointer)UnicodeStrings 16 bits
wchar_t
: Caractère 16 bits - type de données C / C ++ sous-jacentWCHAR
: alias dewchar_t
- type de données WindowsLPWSTR
: chaîne terminée par un zéro deWCHAR
( L ong P ointer)LPCWSTR
: chaîne constante terminée par un zéro deWCHAR
( L ong P ointer)selon
UNICODE
définirTCHAR
: alias deWCHAR
si UNICODE est défini; autrementCHAR
LPTSTR
: chaîne terminée par un zéro deTCHAR
( L ong P ointer)LPCTSTR
: chaîne constante terminée par un zéro deTCHAR
( L ong P ointer)Alors
Lecture bonus
TCHAR
→ Caractère texte ( archive.is )la source
Ajout à 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 ou plus que vous devriez utiliser dans votre application
LPWSTR
LPCWSTR
Le reste est destiné à prendre en charge les plates-formes ANSI ou les doubles compilations. Celles-ci ne sont plus aussi pertinentes aujourd'hui qu'elles l'étaient auparavant.
la source
std::string
car il s'agit toujours d'une chaîne basée sur ASCII et je préfère à lastd::wstring
place.*A
versions de WinAPI compatibles avec la page de codes UTF-8, elles sont soudainement beaucoup plus pertinentes. ; PPour répondre à la deuxième partie de votre question, vous devez faire des choses comme
parce que la
LVITEM
structure de MS a unLPTSTR
, c'est-à-dire un pointeur de chaîne T mutable , pas unLPCTSTR
. Ce que tu fais c'est1) convertir
string
(aCString
au hasard) en anLPCTSTR
(ce qui signifie en pratique obtenir l'adresse de son tampon de caractères comme un pointeur en lecture seule)2) convertir ce pointeur en lecture seule en un pointeur inscriptible en rejetant son caractère
const
-ness.Cela dépend de ce qui
dispinfo
est utilisé, qu'il y ait ou non une chance que votreListView
appel finisse par essayer d' écrire à travers celapszText
. Si c'est le cas, c'est une très mauvaise chose: après tout, vous avez reçu un pointeur en lecture seule, puis vous avez décidé de le traiter comme inscriptible: il y a peut-être une raison pour laquelle il était en lecture seule!Si c'est un
CString
avecstring.GetBuffer()
lequel vous travaillez, vous avez la possibilité d'utiliser - cela vous donne délibérément un fichierLPTSTR
. Vous devez ensuite vous rappeler d'appelerReleaseBuffer()
si la chaîne est modifiée. Ou vous pouvez allouer un tampon temporaire local et y copier la chaîne.99% du temps, ce sera inutile et le traiter
LPCTSTR
comme uneLPTSTR
volonté fonctionnera ... mais un jour, quand vous vous y attendez le moins ...la source
xxx_cast<>()
place.xxx_cast<>
plutôt que de mélanger deux styles de casting différents basés sur les crochets!