Lo que la diferencia entre LPCSTR
, LPCTSTR
y LPTSTR
?
¿Por qué necesitamos hacer esto para convertir una cadena en una variable de estructura LV
/ ? _ITEM
pszText
LV_DISPINFO dispinfo;
dispinfo.item.pszText = LPTSTR((LPCTSTR)string);
c++
windows
visual-c++
mfc
nada maestro
fuente
fuente
Respuestas:
Para responder a la primera parte de su pregunta:
LPCSTR
es un puntero a una cadena constante (LP significa Long Pointer )LPCTSTR
es un puntero a unaconst TCHAR
cadena, (puedeTCHAR
ser un char ancho o char dependiendo de si UNICODE está definido en su proyecto)LPTSTR
es un puntero a unaTCHAR
cadena (no constante)En la práctica, cuando hablamos de estos en el pasado, hemos omitido la frase "puntero a una" por simplicidad, pero como se menciona en Lightness-Race-in-Orbit, todos son indicadores.
Este es un gran artículo de proyecto de código que describe cadenas de C ++ (consulte 2/3 en el camino hacia abajo para ver un gráfico que compara los diferentes tipos)
fuente
extern "C"
. Aparte de eso, sí, definitivamente debería necesitar el bit de "puntero" o una descripción específica como una cadena C.Rápido y sucio:
LP
== L ong P ointer. Solo piensa en puntero o char *C
= C onst, en este caso, creo que quieren decir que la cadena de caracteres es una constante, no que el puntero sea constante.STR
es una cuerdael
T
es de un carácter ancho o char (TCHAR) dependiendo de las opciones de compilación.fuente
AnsiStrings de 8 bits
char
: Carácter de 8 bits - tipo de datos C / C ++ subyacenteCHAR
: alias dechar
- tipo de datos de WindowsLPSTR
: cadena terminada en nulo deCHAR
( L ong P ointer)LPCSTR
: cadena constante terminada en nulo deCHAR
( L ong P ointer)UnicodeStrings de 16 bits
wchar_t
: Carácter de 16 bits - tipo de datos C / C ++ subyacenteWCHAR
: alias dewchar_t
- tipo de datos de WindowsLPWSTR
: cadena terminada en nulo deWCHAR
( L ong P ointer)LPCWSTR
: cadena constante terminada en nulo deWCHAR
( L ong P ointer)dependiendo de
UNICODE
definirTCHAR
: alias deWCHAR
si se define UNICODE; de otra maneraCHAR
LPTSTR
: cadena terminada en nulo deTCHAR
( L ong P ointer)LPCTSTR
: cadena constante terminada en nulo deTCHAR
( L ong P ointer)Entonces
Lectura adicional
TCHAR
→ Texto Char ( archive.is )fuente
Añadiendo a la respuesta de John y Tim.
A menos que esté codificando para Win98, solo hay dos de los más de 6 tipos de cadenas que debe usar en su aplicación
LPWSTR
LPCWSTR
El resto está destinado a admitir plataformas ANSI o compilaciones duales. Esos no son tan relevantes hoy como solían ser.
fuente
std::string
porque sigue siendo una cadena basada en ASCII y prefiero en sustd::wstring
lugar.*A
versiones de WinAPI sean compatibles con la página de códigos UTF-8, de repente son mucho más relevantes. ; PPara responder a la segunda parte de su pregunta, debe hacer cosas como
porque la
LVITEM
estructura de MS tieneLPTSTR
, es decir, un puntero de cadena T mutable , no unLPCTSTR
. Lo que estas haciendo es1) convertir
string
(aCString
en una suposición) en unLPCTSTR
(que en la práctica significa obtener la dirección de su búfer de caracteres como un puntero de solo lectura)2) convierta ese puntero de solo lectura en un puntero escribible
const
desechando su carácter -ness.Depende de lo que
dispinfo
se use para saber si existe la posibilidad de que suListView
llamada termine intentando escribir a través de esopszText
. Si lo hace, esto es algo potencialmente muy malo: después de todo, se le dio un puntero de solo lectura y luego decidió tratarlo como escribible: ¡quizás haya una razón por la que era de solo lectura!Si está
CString
trabajando con él, tiene la opción de usarlostring.GetBuffer()
, que deliberadamente le da una escrituraLPTSTR
. Entonces tienes que recordar llamarReleaseBuffer()
si la cadena se cambia. O puede asignar un búfer temporal local y copiar la cadena allí.El 99% de las veces esto será innecesario y tratarlo
LPCTSTR
como unLPTSTR
testamento funcionará ... pero un día, cuando menos lo esperes ...fuente
xxx_cast<>()
en su lugar.xxx_cast<>
lugar de mezclar dos estilos de fundición diferentes basados en corchetes.