简单任务:发送带有动态分配数据的 Windows 消息,例如任意长度的字符串。您将如何管理释放这些数据的责任?
Windows 消息的接收者可能负责释放这些数据。但是:你怎么能保证所有的消息都会被实际接收,从而链接的数据会被释放?想象一下接收器正在关闭的情况,因此它不会再处理它的消息队列了。但是,消息队列仍然存在(一段时间)并且仍然可以接受消息,这些消息将不再被处理。
谢谢!
简单任务:发送带有动态分配数据的 Windows 消息,例如任意长度的字符串。您将如何管理释放这些数据的责任?
Windows 消息的接收者可能负责释放这些数据。但是:你怎么能保证所有的消息都会被实际接收,从而链接的数据会被释放?想象一下接收器正在关闭的情况,因此它不会再处理它的消息队列了。但是,消息队列仍然存在(一段时间)并且仍然可以接受消息,这些消息将不再被处理。
谢谢!
PostMessage返回一个BOOL
告诉您消息是否已发布的信息。WM_DESTROY
这通常已经足够好了,因为您的窗口在收到和WM_NCDESTROY
消息之前应该是有效的。在调用DestroyWindow(发送这些消息)后,您应该无法再次成功调用 PostMessage。
现在,如果您的 PostMessage 返回 FALSE ,您必须进行清理。如果没有,则必须清理窗口过程。不要将必须清理的消息发送到可能无法处理它们的随机窗口。实际上,不要向您不处理的任何窗口发送任何 WM_USER
+ x 消息。
这里没什么可做的。一旦对 SendMessage 的调用返回,您就可以释放数据。碰巧的是,另一个应用程序无论如何都不会查看您的内存,因为它处于不同的进程中。相反,Windows 跨进程边界编组数据。
更重要的是,如果您在 WndProc 中接收数据,则无法获取指向字符串的指针的副本。相反,您必须获取字符串内容的副本,因为该指针仅在调用 WndProc 期间有效。
另一点是您对消息队列感到困惑。当您发送消息时,它会同步发生并且不涉及队列。消息队列是放置已发布消息的位置。它们是异步处理的。