1

我需要将指针作为std::string消息传递并获取字符串或在主窗口的消息处理程序中。LPARAMWM_USERchar*WM_USER

我怎么做 ?

我现在在做什么(这是不正确的,因为它没有产生它应该产生的结果):

PostMessage(hwnd, LP_DOWNLOADUPDATE, (WPARAM)hHandleToWindow, (LPARAM)&remSize);

whereremSizesdt::string remSize;一个全局变量。

在我正在做的消息处理程序中:

SetWindowText( (HWND)wParam, (char*)lParam );
4

4 回答 4

6

只需要获得一个 C 风格的字符串,即指向一个以零结尾的字符数组的指针:

PostMessage( hwnd, LP_DOWNLOADUPDATE, (WPARAM)hHandleToWindow, remSize.c_str() );

确保remSize在确定消息已被处理之前不会超出范围,否则会有悬空指针。

于 2012-12-10T09:22:02.557 回答
1

您正在发送 a 的地址std::string,并将其解释为char*. 这是行不通的。您需要在发送指针时将其解释为 a 的地址std::string

SetWindowText( (HWND)wParam, ((std::string*)lParam)->c_str() );
于 2012-12-10T09:22:21.190 回答
1

而不是(LPARAM)&remSize您需要通过(LPARAM) remSize.c_str()将您的转换std::string为 const char*(即从std::string实例中提取指针)。

于 2012-12-10T09:22:46.367 回答
1

当您使用PostMessage调用时立即返回,并且消息刚刚放入接收线程的消息队列中。如果被引用的对象超出范围,接收代码将引用一个不存在的对象。这是未定义的行为。

相反,用于SendMessage传递数据。然后接收方可以复制数据并使用PostMessage(如果需要)提醒自己稍后处理数据。

无论如何,如果您从指向 的指针开始std::string,则接收者无法将其转换为char const*或其他一些不相关的类型。在接收端传递一个指向std::string并解释为指向的指针。std::string或者传递一个指针char const*并将其解释为char const*接收端的指针。


加起来:

  • SendMessage通过而不是通过传递指向的数据PostMessage

  • 如果需要,请使用它PostMessage来调用稍后的处理。

  • 不要在不相关的类型之间转换指针。

于 2012-12-10T09:32:21.877 回答