什么是Win32消息编组?

What is Win32 message marshalling?

本文关键字:消息 Win32 什么      更新时间:2023-10-16

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

系统只对系统消息进行封送处理范围0到(WM_USER-1))发送其他消息(那些>= WM_USER)到另一个进程,您必须执行自定义封送。

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

消息有时在其参数中传递指向内存缓冲区的指针。如果你将一个内存地址按原样从一个进程发送给另一个进程,该地址在接收进程中将不具有相同的含义。

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

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

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

考虑一件使IPC变得复杂的独立Win32进程的根本不同之处…它们的地址空间

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

Windows不能做任何事情,甚至远程像用户消息,因为它不知道如何解释它的任何,因此它成为你的责任编组数据的任何消息>= WM_USER