Чтобы ответить на вторую часть вашего вопроса, вам нужно сделать что-то вроде
LV_DISPINFO dispinfo;
dispinfo.item.pszText = LPTSTR((LPCTSTR)string);
потому что структура MS LVITEM
имеет LPTSTR
, то есть изменяемый указатель на T-строку, а не LPCTSTR
. То, что вы делаете, это
1) преобразовать string
(a CString
по предположению) в LPCTSTR
(что на практике означает получение адреса его символьного буфера в виде указателя только для чтения)
2) преобразовать этот указатель только для чтения в записываемый указатель, отбрасывая его const
-ness.
Это зависит от того, что dispinfo
используется для того, есть ли вероятность того, что ваш ListView
вызов закончится попыткой записи через этот pszText
. Если это так, это потенциально очень плохая вещь: в конце концов вам дали указатель только для чтения, а затем решили рассматривать его как доступный для записи: возможно, есть причина, по которой он был доступен только для чтения!
Если это CString
, с которым вы работаете, у вас есть возможность использовать string.GetBuffer()
- который намеренно дает вам доступный для записи LPTSTR
. Затем вы должны не забыть вызвать ReleaseBuffer()
, если строка действительно изменилась. Или вы можете выделить локальный временный буфер и скопировать туда строку.
99% времени это будет ненужным, и трактовка LPCTSTR
как LPTSTR
будет работать ... но однажды, когда вы меньше всего этого ожидаете ...