5 ответов:
чтобы ответить на первую часть вашего вопроса:
LPCSTR- это строка const
LPCTSTRэтоconst TCHARстроку (TCHARбудучи либо широким char или char в зависимости от того, определен ли UNICODE в вашем проекте)
LPTSTRв (не-const)TCHARстрокаэто большая статьи codeproject описание строк C++ (см. 2/3 пути вниз для диаграммы, сравнивающей различные типы)
быстро и грязно:
LP==LОнг Pointer. Просто подумайте указатель или символ*
C= Const, в этом случае я думаю, что они означают, что символьная строка является const, а не указатель const.
STRи строкаthe
Tдля широкого символа или char (TCHAR) в зависимости от параметров компиляции.
8-битные AnsiStrings
char: 8 - битный символ-базовый тип данных C / C++CHAR: псевдонимchar- тип данных WindowsLPSTR: null-завершенной строкуCHAR(LОнг Pointer)LPCSTR: константа null-завершенной строкуCHAR(LОнг Pointer)16-бит UnicodeStrings
wchar_t: 16-битный символ-базовый тип данных C / C++WCHAR: псевдонимwchar_t- тип данных WindowsLPWSTR: null-завершенной строкуWCHAR(LОнг Pointer)LPCWSTR: константа null-завершенной строкуWCHAR(LОнг Pointer)в зависимости от
UNICODEопределить
TCHAR: псевдонимWCHARесли UNICODE определен; в противном случаеCHARLPTSTR: null-завершенной строкуTCHAR(LОнг Pointer)LPCTSTR: константа null-завершенной строкуTCHAR(LОнг Pointer)так
| Item | 8-bit | 16-bit | Varies | |-------------------|--------------|-------------|-----------------| | character | CHAR | WCHAR | TCHAR | | string | LPSTR | LPWSTR | LPTSTR | | string (const) | LPCSTR | LPCWSTR | LPCTSTR |Бонус Чтение
TCHAR→ Текстовый Символ
добавление к ответу Джона и Тима.
Если вы не кодируете для Win98, есть только два из 6 + строковых типов, которые вы должны использовать в своем приложении
LPWSTRLPCWSTRостальные предназначены для поддержки платформ ANSI или двойных компиляций. Сегодня они уже не так актуальны, как раньше.
чтобы ответить на вторую часть вашего вопроса, вам нужно сделать такие вещи, как
LV_DISPINFO dispinfo; dispinfo.item.pszText = LPTSTR((LPCTSTR)string);потому что МС это
LVITEMструктура имеетLPTSTR, т. е. a mutable t-стринги указатель, а неLPCTSTR. То, что вы делаете1) преобразование
string(aCStringна догадку) вLPCTSTR(что на практике означает получение адреса его символьного буфера в качестве указателя только для чтения)2) преобразуйте этот указатель только для чтения в записываемый указатель отбросив его
const-Несс.это зависит от того, что
dispinfoиспользуется для того, есть ли шанс, что вашиListViewзвонок будет в конечном итоге пытается написать черезpszText. Если это так, это потенциально очень плохо: в конце концов, вам дали указатель только для чтения, а затем решили рассматривать его как записываемый: возможно, есть причина, по которой он был доступен только для чтения!если это
CStringвы работаете с вами есть возможность использоватьstring.GetBuffer()-- это намеренно дает вам возможность писатьLPTSTR. Тогда вы должны помнить, чтобы позвонитьReleaseBuffer()если строка будет изменена. Или вы можете выделить локальный временный буфер и скопировать строку туда.99% времени это будет ненужным и лечения
LPCTSTRкакLPTSTRбудет работать... но однажды, когда ты меньше всего этого ожидаешь...
Comments