_T это макрос . Препроцессор просто добавляет L к строке "Hello, World!".
...
Этот код не соберется с ошибкой Error:идентификатор "Lstr" не определен.
Мде... А кто сказал, что его надо как-то применять? Тем более в таком виде:
Code:
string str("hello world");
cout << _T(str.c_str());
_Т() - применяется только к литералам, т.е. к строкам.
В моем примере, строка кода:
Code:
LPCTSTR test = _T("Hello, World!");
Предназначена всего-лишь для НАГЛЯДНОГО создания переменной "test" типа LPCTSTR. Я бы мог выдать, что-то в этом роде:
Code:
LPCTSTR test = ptsHelloWorld;
Но, если кому-то вздумается проверить работу примера, все равно придется как-то создавать ptsHelloWorld.
Т е явно привести тип . Наверно это лучшее, что я сейчас могу . Хотя придется добавлять + 1 строку при каждом получении данных.
Ну зачем добавлять еще одну строку?
А если не копировать , то вообще нет гарантии , что контролы не модифицируют данные в векторе.
Это само собой разумеется...
Меня больше другое пузырит . Неужели нет строчного типа данных , который предусмотрено использовать с контролами по дефолту . Т е когда microsoft создавала api они же должны были понимать , что люди врядли будут хранить свои данные в char * ?
Все есть. Надо только больше думать и меньше бездумно копировать. Используемый тобой тип wstring вполне себе годится для твоих целей.
Вернемся к твоему вопросу:
Проблема в том что структура lvitem в pszText хочет получить lpwstr . А wstring методом c_str() отдает lpcwstr . Т е константу .
LPWSTR тоже самое что и LPTSTR, а LPCWSTR тоже самое что LPCTSTR. Так как в MSDN, параметр pszText, в стуктуре LV_ITEM, задан как LPTSTR, то я составил следующий пример:
Code:
LPCTSTR test = _T("Hello, World!");
LPTSTR pszText = (LPTSTR) test;
Все что тебе нужно было сделать, это просто добавить "(LPTSTR)" в месте где происходила ошибка:
Code:
lvitem.pszText = (LPTSTR) wdat->phone.c_str();
И все должно работать.