1

我制作了一个使用 WIN32 将字符串发送到列表框的函数

char data[] = "abcd";

addToList(hWnd,data);

void addToList(HWND hWnd,char data[] ){
  SendMessage(GetDlgItem(hWnd,IDC_LISTBOX),LB_ADDSTRING,0,(LPARAM)data);    
}

当我执行此操作时,它会将数据发送到列表框,但问题出现在奇怪的字符中,我也尝试过 wchar_t 但问题仍然存在

4

1 回答 1

5

首先,您应该检查 API 调用是否有错误。您需要检查对 API 函数的所有调用的返回值。

也就是说,鉴于问题中的代码,

SendMessage(GetDlgItem(hWnd,IDC_LISTBOX),LB_ADDSTRING,0,(LPARAM)data); 

如果这导致一个项目被添加到列表框中,那么这意味着它GetDlgItem确实返回了一个有效的窗口句柄,并且data确实指向了有效的内存。在这种情况下,您报告的唯一解释是编码的文本不匹配。

因此,我们可以假设SendMessage宏的计算结果为SendMessageW。而且由于您传递的是 ANSI 编码的文本,因此这种不匹配说明了症状。该函数将文本视为 UTF-16 编码。

一种明显的解决方案是SendMessageA改用。但是,在我看来,更好的解决方案是传递 UTF-16 编码的数据。

wchar_t data[] = L"abcd";
....
void addToList(HWND hWnd, const wchar_t *data)
{
    SendMessage(GetDlgItem(hWnd,IDC_LISTBOX), LB_ADDSTRING, 0, (LPARAM)data);    
}

显然,您的代码会添加我在开始时提到的错误检查。

于 2013-02-17T20:06:04.700 回答