C++ ListView_GetItemText仅获取第一个字符

C++ ListView_GetItemText仅获取第一个字符,c++,winapi,listview,C++,Winapi,Listview,我试图通过使用获取ListView子项的文本值。 这是我的密码: char *bufText = new char[256]; ListView_GetItemText(GetDlgItem(myWindow, MYLISTVIEW), myInt, 1, (LPTSTR)bufText, 256); myInt是列表视图中一行的索引 但是strlenbufText等于1,bufText中唯一的字符是列表视图子项的第一个字符 我在这里做错了什么?您使用的是Unicode构建,但使用强制转换将

我试图通过使用获取ListView子项的文本值。 这是我的密码:

char *bufText = new char[256];
ListView_GetItemText(GetDlgItem(myWindow, MYLISTVIEW), myInt, 1, (LPTSTR)bufText, 256);
myInt是列表视图中一行的索引

但是strlenbufText等于1,bufText中唯一的字符是列表视图子项的第一个字符


我在这里做错了什么?

您使用的是Unicode构建,但使用强制转换将ANSI缓冲区传递给控件。更改为:

char* bufText = new char[256];
致:


或者,如果您特别想使用ANSI,请发送LVM_GETITEMTEXTA消息,而不是使用宏。

您使用的是Unicode构建,但使用强制转换将ANSI缓冲区传递给控件。更改为:

char* bufText = new char[256];
致:

或者,如果您特别想使用ANSI,请发送LVM_GETITEMTEXTA消息,而不是使用宏

这是我的密码:

char *bufText = new char[256];
ListView_GetItemText(GetDlgItem(myWindow, MYLISTVIEW), myInt, 1, (LPTSTR)bufText, 256);
但是strlenbufText等于1,并且是 bufText是列表视图子项的第一个

我做错了什么

我认为问题在于,您是在Unicode模式下构建的,这是VS2005以来的默认模式,因此ListView_GetItemText向您发送了一个Unicode字符串,但您有一个不匹配的情况,因为BuftText的类型是char*即ANSI/MBCS字符串,而不是wchar_t*即Unicode UTF-16字符串

编译器正在帮助您,给您一条错误消息,因为您将指向ANSI/MBCS字符串的指针传递给char*bufText参数,而不是wchar\u t*。 但是,您没有尝试侦听编译器,而是使用错误的类型强制转换到LPTSTR来关闭它,在Unicode构建中,LPTSTR扩展为wchar\u t*

那么,为什么你只得到一个角色

假设ListView_GetItemText检索的列表视图控件中存储的文本是hello

它在内存中的Unicode表示为:

68 00   65 00   6C 00   6C 00   6F 00   00 00
  h       e       l        l      o      NUL
因为Unicode UTF-16表示h为0x0068,表示e为0x0065,表示l为0x006C,表示o为0x006F;0x0000是Unicode NUL终止符

但是,当您将上述字节序列解释为ANSI字符串时,ANSI字符串的单字节NUL终止符是0x68 ASCII h字节后的第一个0x00字节,因此在ANSI中,您只需得到:

68  00      <---- ANSI stops at the *first* 0x00 byte
 h  \0
这是我的密码:

char *bufText = new char[256];
ListView_GetItemText(GetDlgItem(myWindow, MYLISTVIEW), myInt, 1, (LPTSTR)bufText, 256);
但是strlenbufText等于1,并且是 bufText是列表视图子项的第一个

我做错了什么

我认为问题在于,您是在Unicode模式下构建的,这是VS2005以来的默认模式,因此ListView_GetItemText向您发送了一个Unicode字符串,但您有一个不匹配的情况,因为BuftText的类型是char*即ANSI/MBCS字符串,而不是wchar_t*即Unicode UTF-16字符串

编译器正在帮助您,给您一条错误消息,因为您将指向ANSI/MBCS字符串的指针传递给char*bufText参数,而不是wchar\u t*。 但是,您没有尝试侦听编译器,而是使用错误的类型强制转换到LPTSTR来关闭它,在Unicode构建中,LPTSTR扩展为wchar\u t*

那么,为什么你只得到一个角色

假设ListView_GetItemText检索的列表视图控件中存储的文本是hello

它在内存中的Unicode表示为:

68 00   65 00   6C 00   6C 00   6F 00   00 00
  h       e       l        l      o      NUL
因为Unicode UTF-16表示h为0x0068,表示e为0x0065,表示l为0x006C,表示o为0x006F;0x0000是Unicode NUL终止符

但是,当您将上述字节序列解释为ANSI字符串时,ANSI字符串的单字节NUL终止符是0x68 ASCII h字节后的第一个0x00字节,因此在ANSI中,您只需得到:

68  00      <---- ANSI stops at the *first* 0x00 byte
 h  \0

嗯,我还怀疑有编码错误。我已经尝试使用wchar\t,但仍然存在相同的问题:我还怀疑有编码错误。我已经尝试使用wchar\t,但仍然存在相同的问题:当您使用强制转换抑制编译器错误时,您已经获得了标准结果。当编译器告诉您bufText是错误的类型时,您选择了错误的解决方案。您没有正确声明它,而是告诉编译器您比它和cast更了解它。移除石膏并正确地修复问题。那么,你能解释一下如何正确地修复它吗?乔纳森的回答已经做到了。您真的不想使用ANSI API。那件事和我一起出去了。我不知道为什么您认为发送LVM_GETITEMTEXTA是有帮助的。当您使用强制转换抑制编译器错误时,您已经获得了标准结果。当编译器告诉您bufText是错误的类型时,您选择了错误的解决方案。您没有正确声明它,而是告诉编译器您比它和cast更了解它。移除石膏并正确地修复问题。那么,你能解释一下如何正确地修复它吗?乔纳森的回答已经做到了。您真的不想使用ANSI API。那件事和我一起出去了。我不知道你为什么认为发送LVM_GETITEMTEXTA是有帮助的。谢谢你非常完整的回答!谢谢你完整的回答!