【问题标题】:getting garbage using SendMessage to populate a Listbox使用 SendMessage 获取垃圾以填充列表框
【发布时间】: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::stringchar切换到std::wstringwchar_t。这将使您的应用程序进入 20 世纪并支持 Unicode,并允许您调用 SendMessageW,正如您应该做的那样。
  • @immibis 是的,我知道那些人。我不同意他们的看法。我已经厌倦了争论。就我而言,所有 UI 代码都应该使用操作系统所做的任何事情。在 Windows 中,这意味着 UTF-16。 “UTF-8 Everywhere”活动相当愚蠢,“无处不在”使用任何东西都没有意义。使用 UTF-8 作为面向公众的 API 的一部分,在与世界共享数据时,但在与操作系统交互时,使用操作系统所做的事情。在 SendMessage 之前立即进行转换是没有意义的; UI 字符串不应该被转换为 UTF-8。

标签: c++ windows winapi listbox sendmessage


【解决方案1】:

SendMessage是一个宏,可以定义为SendMessageW,它使用Unicode字符串。

您正在使用std::stringchar,因此请尝试使用SendMessageA,它明确使用ANSI 字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多