gpt4 book ai didi

c++ - ListView_GetItemText 只获取第一个字符

转载 作者:行者123 更新时间:2023-11-30 00:53:05 27 4
gpt4 key购买 nike

我正在尝试使用 ListView_GetItemText() 获取 ListView 子项的文本值.
这是我的代码:

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

但是strlen(bufText)等于1,bufText中唯一的字符是list-view子项的第一个。

我在这里做错了什么?

最佳答案

Here is my code:

char *bufText = new char[256];
ListView_GetItemText(GetDlgItem(myWindow, MYLISTVIEW), myInt, 1, (LPTSTR)bufText, 256);

But strlen(bufText) is equal to 1, and the only character in bufText is the first one of the list-view sub-item.

What am I doing wrong here?

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

编译器正在帮助您,给您一条错误消息,因为您传递的是一个指向 ANSI/MBCS 字符串(char* bufText 参数)的指针,而不是wchar_t*.
但不是尝试听编译器,而是将错误类型转换为 LPTSTR(在 Unicode 构建中扩展为 wchar_t*).


那么,为什么你只得到一个字符

假设存储在 ListView 控件中的文本(由 ListView_GetItemText() 检索)是 "hello"

它在内存中的 Unicode 表示是:

68 00   65 00   6C 00   6C 00   6F 00   00 00
h e l l o NUL

(因为 h 的 Unicode UTF-16 表示是 0x0068e0x0065,对于 l0x006C,对于o0x006F0x0000为Unicode NUL 终止符。)

但是当您解释上述字节序列ANSI字符串时,(单字节)NUL终止符对于 ANSI 字符串是 0x68 (ASCII h) 字节之后的 first 0x00 字节,所以在 ANSI 中你刚刚得到:

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

"h" ANSI 字符串,因此您只需获取初始 Unicode UTF-16 字符串的第一个字符


我的建议是只转向现代软件中的 Unicode 构建

此外,那些原始的类 C 字符数组 不是现代 C++:它们不是异常安全的,而且您必须手动注意 delete[] 返回的指针等
最好使用现代健壮的 RAII 容器,例如 std::vectorstd::wstring

例如

#include <vector> // for std::vector

....
//
// Allocate a vector of 256 wchar_t's (so use Unicode).
//
// (Note: Memory is automatically cleaned up in the destructor,
// no need for *manual* delete[].)
//
std::vector<wchar_t> bufText( 256 );

//
// Get text from the list-view control.
//
ListView_GetItemText
(
GetDlgItem(myWindow, MYLISTVIEW),
myInt,
1,
&bufText[0], // <--- pointer to first character in the buffer
bufText.size() // <--- size of the buffer, in wchar_t's
);

关于c++ - ListView_GetItemText 只获取第一个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17400839/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com