【发布时间】:2016-07-07 16:33:55
【问题描述】:
我正在尝试在 Visual Studio 上使用 c++ 填充列表框。我有一个 std:string 数组,我想使用它们。我的解决方案似乎不起作用:
std::string label = "something";
char *buffer;
buffer = _strdup((label).c_str());
我检查了缓冲区变量包含正确的字符串,但后来我调用了 SendMessage
SendMessage(hwndList, LB_ADDSTRING, 0, (LPARAM)buffer);
ListBox 被填充,但我看到的不是“某物”,而是一些随机的日文字符...
【问题讨论】:
-
如果你使用
SendMessageA而不是SendMessage会发生什么? -
它有效!我需要对此进行调查...谢谢!!
-
忽略关于
strdup的编译器警告,首先不需要它。SendMessageA(hwndList, LB_ADDSTRING, 0, (LPARAM)(label.c_str()));也可以正常工作,无需分配更多内存。 -
长期,你应该从
std::string和char切换到std::wstring和wchar_t。这将使您的应用程序进入 20 世纪并支持 Unicode,并允许您调用SendMessageW,正如您应该做的那样。 -
@immibis 是的,我知道那些人。我不同意他们的看法。我已经厌倦了争论。就我而言,所有 UI 代码都应该使用操作系统所做的任何事情。在 Windows 中,这意味着 UTF-16。 “UTF-8 Everywhere”活动相当愚蠢,“无处不在”使用任何东西都没有意义。使用 UTF-8 作为面向公众的 API 的一部分,在与世界共享数据时,但在与操作系统交互时,使用操作系统所做的事情。在 SendMessage 之前立即进行转换是没有意义的; UI 字符串不应该被转换为 UTF-8。
标签: c++ windows winapi listbox sendmessage