LPCSTR,LPCTSTR和LPTSTR

LPCSTRLPCTSTRLPTSTR什么区别?

为什么我们需要将string转换为LV / _ITEM结构variablespszText

 LV_DISPINFO dispinfo; dispinfo.item.pszText = LPTSTR((LPCTSTR)string); 

回答你的问题的第一部分:

LPCSTR是一个常量string

LPCTSTR是一个const TCHARstring,( TCHAR是一个宽字符或字符取决于UNICODE是否在您的项目中定义)

LPTSTR是一个(非const) TCHARstring

这是一个很棒的codeproject文章,描述C ++string(比较不同types的图表,请参阅2/3的下载方式)

快速和肮脏:

LP ==长指针。 只是想指针或字符*

C =常量在这种情况下,我认为他们的意思是string是一个常量,而不是指针是常量。

STR是string

T代表宽字符或字符(TCHAR),具体取决于编译选项。

添加约翰和蒂姆的答案。

除非你正在编写Win98,否则在应用程序中应该使用6+个stringtypes中的两个

  • LPWSTR
  • LPCWSTR

其余的意图是支持ANSI平台或双编译。 那些今天不像以前那样有意义。

回答你的问题的第二部分,你需要做的事情

 LV_DISPINFO dispinfo; dispinfo.item.pszText = LPTSTR((LPCTSTR)string); 

因为MS的LVITEM结构有一个LPTSTR ,即一个可变的 Tstring指针,而不是一个LPCTSTR 。 你在做什么

1)将string (一个猜测的CString )转换成一个LPCTSTR (实际上意味着获取字符缓冲区的地址作为一个只读指针)

2)将该只读指针转换为一个可写指针,通过抛弃它的const

这取决于使用dispinfo是否有可能你的ListView调用最终试图通过pszText 写入 。 如果是的话,这是一个可能非常糟糕的事情:毕竟你得到一个只读指针,然后决定把它看作是可写的:也许有一个原因是只读的!

如果它是一个CString你正在与你有select使用string.GetBuffer() – 故意给你一个可写的LPTSTR 。 然后你必须记得调用ReleaseBuffer()如果string改变。 或者您可以分配一个本地临时缓冲区,并将string复制到那里。

99%的时间这将是不必要的,把LPCTSTR当作LPTSTR可行的…但有一天,当你最不期待的时候…

8位AnsiStrings

  • char :8位字符 – 底层C / C ++数据types
  • CHARchar别名 – Windows数据types
  • LPSTR :以CHAR结尾的空string
  • LPCSTRCHAR常量以NULL结尾的string

16位UnicodeString

  • wchar_t :16位字符 – C / C ++数据types的基础
  • WCHARwchar_t别名 – Windows数据types
  • LPWSTR :以WCHAR结尾的空string
  • LPCWSTRWCHAR空字符结尾的常量string

取决于UNICODE定义

  • TCHAR :如果定义了UNICODE,则为WCHAR别名; 否则CHAR
  • LPTSTR :以TCHAR结尾的空string
  • LPCWSTR :以TCHAR常量以空字符结尾的string

所以

 | Item | 8-bit | 16-bit | Varies | |-------------------|--------------|-------------|-----------------| | character | CHAR | WCHAR | TCHAR | | string | LPSTR | LPWSTR | LPTSTR | | string (const) | LPCSTR | LPCWSTR | LPCTSTR |