什么是Win32消息编组?

时间:2014-06-13 01:46:05

标签: c++ windows winapi message-queue

如果我阅读PostMessage API的说明,则会出现以下句子:

  

系统仅对系统消息进行编组(系统消息中的那些消息)   范围0到(WM_USER-1))。要发送其他消息(那些> = WM_USER)   另一个过程,你必须做自定义编组。

我很好奇那是什么"消息编组"?

2 个答案:

答案 0 :(得分:7)

消息有时会在其参数中传递指向内存缓冲区的指针。如果您将内存地址从一个进程发送到另一个进程,则该地址在接收过程中的含义不同。

对于系统消息,例如WM_SETTEXTWM_COPYDATA,操作系统知道如何使用这些消息的内存缓冲区。在跨进程发送此类消息时,操作系统会在接收过程中自动分配适当的内存缓冲区,并使用原始数据的副本填充它。然后,在将消息传递到目标消息处理程序之前,将消息参数调整为相应地指向新的内存地址。

对于包含指针的自定义消息,操作系统无法为您自动封送数据,因此您必须执行自己的自定义封送处理。

这就是消息编组的内容。以安全的方式将外部引用的数据从一个进程复制到另一个进程,以便消息中的任何指针在接收进程的地址空间内都有意义。

答案 1 :(得分:3)

考虑一下,对于使IPC复杂的单独的Win32进程有一些根本不同的东西......它们的地址空间。

编组非常普遍是指打包数据以便跨主机/进程进行通信。在这种情况下,Windows负责处理 it 所知的消息中的任何指针,以便它们是接收进程的地址空间中的有效指针。换句话说,如果消息指向发送过程中的某些内容,Windows会确保复制它指向的内容,并在收到消息后更改消息,以便指向在新地址空间中复制内存的位置。

Windows无法像用户消息那样远程执行任何操作,因为它不知道如何解释任何消息,因此您有责任封送任何消息> = WM_USER的数据。