c00*_*0fd 1 c++ windows winapi message-queue
如果我阅读PostMessage API 的描述,它有这句话:
系统仅对系统消息进行编组(范围为0到(WM_USER-1)).要将其他消息(那些> = WM_USER)发送到另一个进程,您必须执行自定义编组.
我很好奇那个"消息编组"是什么?
消息有时会在其参数中传递指向内存缓冲区的指针.如果您将内存地址从一个进程发送到另一个进程,则该地址在接收过程中的含义不同.
对于系统消息,如WM_SETTEXT和WM_COPYDATA例如,操作系统知道如何与这些邮件的内存缓冲区工作.在跨进程发送此类消息时,操作系统会在接收过程中自动分配适当的内存缓冲区,并使用原始数据的副本填充它.然后,在将消息传递到目标消息处理程序之前,将消息参数调整为相应地指向新的存储器地址.
对于包含指针的自定义消息,操作系统无法为您自动封送数据,因此您必须执行自己的自定义封送处理.
这就是消息编组的意义所在.以安全的方式将外部引用的数据从一个进程复制到另一个进程,以便消息中的任何指针在接收进程的地址空间内都有意义.
考虑一下与单独的 Win32 进程有根本不同的一件事,这使得 IPC 变得复杂……它们的地址空间。
编组通常是指将数据打包以便跨主机/进程进行通信。在这种情况下,Windows 会处理它所发送的消息中的任何指针。知道的消息中的所有指针,以便它们是接收进程地址空间中的有效指针。换句话说,如果消息在发送过程中指向某些内容,Windows 将确保它所指向的内容被复制,并且在接收到消息后,消息会被更改,以便它指向新地址空间中该内存被复制的任何位置。
Windows 无法对用户消息执行任何远程操作,因为它不知道如何解释任何消息,因此您有责任整理任何消息 >= 的数据WM_USER。
| 归档时间: |
|
| 查看次数: |
952 次 |
| 最近记录: |