C++ ListView_GetItemText仅获取第一个字符
我试图通过使用获取ListView子项的文本值。 这是我的密码: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构建,但使用强制转换将
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是有帮助的。谢谢你非常完整的回答!谢谢你完整的回答!