Lo que la diferencia entre LPCSTR, LPCTSTRy LPTSTR?
¿Por qué necesitamos hacer esto para convertir una cadena en una variable de estructura LV/ ? _ITEMpszText
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:
LPCSTRes un puntero a una cadena constante (LP significa Long Pointer )LPCTSTRes un puntero a unaconst TCHARcadena, (puedeTCHARser un char ancho o char dependiendo de si UNICODE está definido en su proyecto)LPTSTRes un puntero a unaTCHARcadena (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.STRes una cuerdael
Tes 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
UNICODEdefinirTCHAR: alias deWCHARsi se define UNICODE; de otra maneraCHARLPTSTR: 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
LPWSTRLPCWSTREl resto está destinado a admitir plataformas ANSI o compilaciones duales. Esos no son tan relevantes hoy como solían ser.
fuente
std::stringporque sigue siendo una cadena basada en ASCII y prefiero en sustd::wstringlugar.*Aversiones 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
LVITEMestructura de MS tieneLPTSTR, es decir, un puntero de cadena T mutable , no unLPCTSTR. Lo que estas haciendo es1) convertir
string(aCStringen 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
constdesechando su carácter -ness.Depende de lo que
dispinfose use para saber si existe la posibilidad de que suListViewllamada 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á
CStringtrabajando 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
LPCTSTRcomo unLPTSTRtestamento 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.