Win32消息传送是什么?

3
如果我阅读PostMessage API的描述,它有这样一句话:
系统只为系统消息(范围在0到(WM_USER-1)之间)执行编组。要将其他消息(>= WM_USER)发送到另一个进程,必须执行自定义编组。
我想知道什么是“消息编组”?

请参考这个问题了解COM的介绍,以及这篇Code Project文章了解自定义封送。这可能是一个漫长的旅程。 - red_eight
1
@red_eight:消息编组和COM编组是无关的。 - IInspectable
2个回答

9
有时消息在其参数中传递内存缓冲区的指针。如果直接将内存地址从一个进程发送到另一个进程,该地址在接收进程中的含义将不同。
对于系统消息,例如WM_SETTEXTWM_COPYDATA,操作系统知道如何处理这些消息的内存缓冲区。当跨进程发送此类消息时,操作系统会自动在接收进程中分配适当的内存缓冲区,并用原始数据的副本填充它。然后相应地调整消息参数以指向新的内存地址,然后将消息传递到目标消息处理程序。
对于包含指针的自定义消息,操作系统无法自动为您编排数据,因此您必须执行自己的自定义编排。
这就是所谓的消息编排。以安全的方式从一个进程复制外部引用的数据到另一个进程,以使消息中的任何指针在接收进程的地址空间内有意义。

@c00000fd:嗯,还有一些其他的事情会让解释变得更加复杂。例如,句柄不一定是指针,但它们所引用的内容可能是特定于线程或进程的。在编组和稍后取消编组某些内容的过程中,可能需要在接收端创建新资源,以使这些句柄具有意义。因此,任何类型的引用都有可能需要特殊处理。微软可能认为个人熟悉计算机科学的一般概念。 - Andon M. Coleman
2
这个对于marshaling术语的解释可以说是相当牵强附会了。微软干得好! - GetFree

5
考虑到分离的Win32进程中最基本的不同之一,导致了IPC的复杂性,那就是它们的地址空间。
打包数据以跨主机/进程进行通信,这是“编排”的含义。在此情况下,Windows会处理消息中任何指针,以便在接收进程的地址空间中它们是有效的指针。换句话说,如果消息指向发送进程中的某个东西,Windows会确保所指向的东西被复制,并且在接收后,消息被更改为指向该内存在新地址空间中被复制的位置。
对于用户消息,Windows无法执行类似的操作,因为它不知道如何解释其中的任何内容,因此您需要负责为任何消息≥WM_USER编排数据。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接