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 LVITEM
structure de MS a un LPTSTR
, c'est-à-dire un pointeur de chaîne T mutable , pas un LPCTSTR
. Ce que tu fais c'est
1) convertir string
(a CString
au hasard) en an LPCTSTR
(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 votre ListView
appel finisse par essayer d' écrire à travers cela pszText
. 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
avec string.GetBuffer()
lequel vous travaillez, vous avez la possibilité d'utiliser - cela vous donne délibérément un fichier LPTSTR
. Vous devez ensuite 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.
99% du temps, ce sera inutile et le traiter LPCTSTR
comme une LPTSTR
volonté fonctionnera ... mais un jour, quand vous vous y attendez le moins ...