Qual é a diferença entre LPCSTR
, LPCTSTR
e LPTSTR
?
Por que precisamos fazer isso para converter uma string em uma variável LV
/ _ITEM
structure pszText
:
LV_DISPINFO dispinfo;
dispinfo.item.pszText = LPTSTR((LPCTSTR)string);
c++
windows
visual-c++
mfc
nothingMaster
fonte
fonte
Respostas:
Para responder à primeira parte da sua pergunta:
LPCSTR
é um ponteiro para uma string const (LP significa Ponteiro Longo )LPCTSTR
é um ponteiro para umaconst TCHAR
string (TCHAR
sendo um caractere largo ou caractere dependendo se UNICODE está definido em seu projeto)LPTSTR
é um ponteiro para umaTCHAR
string (não const)Na prática, quando falamos sobre isso no passado, deixamos de fora a frase "ponteiro para" para simplificar, mas, como mencionado pelas corridas de leveza em órbita, todos são ponteiros.
Este é um ótimo artigo de projeto de código que descreve strings C ++ (consulte 2/3 abaixo para ver um gráfico comparando os diferentes tipos)
fonte
extern "C"
. Além disso, sim, ele definitivamente deve precisar do bit "ponteiro" ou de uma descrição específica como uma string C.Rapido e sujo:
LP
== L ong P ointer. Basta pensar em ponteiro ou char *C
= C onst, neste caso, acho que eles significam que a string de caracteres é uma const, e não o ponteiro sendo const.STR
é stringo
T
é para uma grande personagem ou char (TCHAR), dependendo das opções de compilação.fonte
AnsiStrings de 8 bits
char
: Caractere de 8 bits - tipo de dados C / C ++ subjacenteCHAR
: alias dechar
- tipo de dados do WindowsLPSTR
: string terminada em nulo deCHAR
( L ong P ointer)LPCSTR
: string constante terminada em nulo deCHAR
( L ong P ointer)UnicodeStrings de 16 bits
wchar_t
: Caractere de 16 bits - tipo de dados C / C ++ subjacenteWCHAR
: alias dewchar_t
- tipo de dados do WindowsLPWSTR
: string terminada em nulo deWCHAR
( L ong P ointer)LPCWSTR
: string constante terminada em nulo deWCHAR
( L ong P ointer)dependendo de
UNICODE
definirTCHAR
: alias deWCHAR
se UNICODE for definido; de outra formaCHAR
LPTSTR
: string terminada em nulo deTCHAR
( L ong P ointer)LPCTSTR
: string constante terminada em nulo deTCHAR
( L ong P ointer)assim
Leitura de bônus
TCHAR
→ Caractere de texto ( arquivo.is )fonte
Somando-se à resposta de John e Tim.
A menos que você esteja codificando para Win98, existem apenas dois dos mais de 6 tipos de string que você deve usar em seu aplicativo
LPWSTR
LPCWSTR
O restante destina-se a suportar plataformas ANSI ou compilações duplas. Esses não são tão relevantes hoje como costumavam ser.
fonte
std::string
porque ainda é uma string baseada em ASCII e prefirostd::wstring
.*A
versões do WinAPI compatíveis com a página de código UTF-8, de repente elas são muito mais relevantes. ; PPara responder à segunda parte da sua pergunta, você precisa fazer coisas como
porque a
LVITEM
estrutura de MS tem umLPTSTR
, ou seja, um ponteiro mutável de string T, não umLPCTSTR
. O que você está fazendo é1) converter
string
(aCString
em um palpite) em umLPCTSTR
(o que na prática significa obter o endereço de seu buffer de caracteres como um ponteiro somente leitura)2) converter aquele ponteiro somente leitura em um ponteiro gravável descartando sua
const
-ness.Depende do que
dispinfo
é usado se há ou não uma chance de que suaListView
chamada acabe tentando escrever através dissopszText
. Se isso acontecer, isso é potencialmente muito ruim: afinal, você recebeu um ponteiro somente leitura e decidiu tratá-lo como gravável: talvez haja um motivo pelo qual ele era somente leitura!Se for um com o qual
CString
você está trabalhando, você tem a opção de usarstring.GetBuffer()
- isso deliberadamente dá a você um gravávelLPTSTR
. Em seguida, você deve se lembrar de chamarReleaseBuffer()
se a string for alterada. Ou você pode alocar um buffer temporário local e copiar a string para lá.99% das vezes isso será desnecessário e tratá-los
LPCTSTR
como umLPTSTR
funcionará ... mas um dia, quando você menos esperar ...fonte
xxx_cast<>()
lugar.xxx_cast<>
vez de misturar dois estilos de fundição baseados em colchetes diferentes!