Answers:
要回答问题的第一部分:
LPCSTR
是指向const字符串的指针(LP表示Long Pointer)
LPCTSTR
是指向const TCHAR
字符串的指针(TCHAR
是宽字符还是char,取决于项目中是否定义了UNICODE)
LPTSTR
是指向(非常量)TCHAR
字符串的指针
实际上,在过去谈论这些时,为简单起见,我们省略了“指向某个单词的指针”一词,但是正如“轻度赛道”所提到的,它们都是指针。
这是一篇很棒的codeproject文章,描述了C ++字符串(请参阅2/3,了解不同类型的图表)
extern "C"
。是的,除此之外,它肯定应该需要“指针”位或特定的C字符串描述。
快速而肮脏:
LP
== 大号翁P ointer。只考虑指针或char *
C
= C onst,在这种情况下,我认为它们表示字符串是const,而不是指针是const。
STR
是字符串
T
根据编译选项,它适用于宽字符或char(TCHAR)。
char
:8位字符-基础C / C ++数据类型CHAR
:char
-Windows数据类型的别名LPSTR
:(L ong p ointer)的以 null终止的字符串CHAR
LPCSTR
:(L ong P ointer)的以空值结尾的常量字符串CHAR
wchar_t
:16位字符-底层C / C ++数据类型WCHAR
:wchar_t
-Windows数据类型的别名LPWSTR
:(L ong p ointer)的以 null终止的字符串WCHAR
LPCWSTR
:(L ong P ointer)的以空值结尾的常量字符串WCHAR
UNICODE
定义TCHAR
:WCHAR
是否定义了UNICODE的别名;除此以外CHAR
LPTSTR
:(L ong p ointer)的以 null终止的字符串TCHAR
LPCTSTR
:(L ong P ointer)的以空值结尾的常量字符串TCHAR
所以
| Item | 8-bit | 16-bit | Varies |
|-------------------|--------------|-------------|-----------------|
| character | CHAR | WCHAR | TCHAR |
| string | LPSTR | LPWSTR | LPTSTR |
| string (const) | LPCSTR | LPCWSTR | LPCTSTR |
TCHAR
→ 文字字符 (archive.is)
添加到约翰和蒂姆的答案。
除非您为Win98编码,否则应在应用程序中使用6+字符串类型中的只有两种
LPWSTR
LPCWSTR
其余部分旨在支持ANSI平台或双重编译。今天,它们已经不像以前那样重要了。
std::string
它,因为它仍然是基于ASCII的字符串,因此更喜欢std::wstring
使用。
*A
WinAPI版本与UTF-8代码页兼容,因此它们之间的联系突然变得更加相关。; P
要回答问题的第二部分,您需要执行以下操作
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
工作是可行的……但是有一天,当您最不希望这样做时……
xxx_cast<>()
而应改用。
xxx_cast<>
而不是混合两种基于括号的转换样式!