什么是Win32消息编组?

c00*_*0fd 1 c++ windows winapi message-queue

如果我阅读PostMessage API 的描述,它有这句话:

系统仅对系统消息进行编组(范围为0到(WM_USER-1)).要将其他消息(那些> = WM_USER)发送到另一个进程,您必须执行自定义编组.

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

Rem*_*eau 7

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

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

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

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

  • 至少可以说,对术语编组的这种解释是相当做作的。微软干得好! (2认同)

And*_*man 5

考虑一下与单独的 Win32 进程有根本不同的一件事,这使得 IPC 变得复杂……它们的地址空间。

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

Windows 无法对用户消息执行任何远程操作,因为它不知道如何解释任何消息,因此您有责任整理任何消息 >= 的数据WM_USER