如果我阅读PostMessage API的说明,则会出现以下句子:
系统仅对系统消息进行编组(系统消息中的那些消息) 范围0到(WM_USER-1))。要发送其他消息(那些> = WM_USER) 另一个过程,你必须做自定义编组。
我很好奇那是什么"消息编组"?
答案 0 :(得分:7)
消息有时会在其参数中传递指向内存缓冲区的指针。如果您将内存地址从一个进程发送到另一个进程,则该地址在接收过程中的含义不同。
对于系统消息,例如WM_SETTEXT
和WM_COPYDATA
,操作系统知道如何使用这些消息的内存缓冲区。在跨进程发送此类消息时,操作系统会在接收过程中自动分配适当的内存缓冲区,并使用原始数据的副本填充它。然后,在将消息传递到目标消息处理程序之前,将消息参数调整为相应地指向新的内存地址。
对于包含指针的自定义消息,操作系统无法为您自动封送数据,因此您必须执行自己的自定义封送处理。
这就是消息编组的内容。以安全的方式将外部引用的数据从一个进程复制到另一个进程,以便消息中的任何指针在接收进程的地址空间内都有意义。
答案 1 :(得分:3)
考虑一下,对于使IPC复杂的单独的Win32进程有一些根本不同的东西......它们的地址空间。
编组非常普遍是指打包数据以便跨主机/进程进行通信。在这种情况下,Windows负责处理 it 所知的消息中的任何指针,以便它们是接收进程的地址空间中的有效指针。换句话说,如果消息指向发送过程中的某些内容,Windows会确保复制它指向的内容,并在收到消息后更改消息,以便指向在新地址空间中复制内存的位置。
Windows无法像用户消息那样远程执行任何操作,因为它不知道如何解释任何消息,因此您有责任封送任何消息> = WM_USER
的数据。