【问题标题】:What is Win32 message marshalling?什么是 Win32 消息编组?
【发布时间】:2014-08-03 11:51:20
【问题描述】:

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

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

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

【问题讨论】:

  • 请参阅this question 了解有关 COM 介绍的链接,并参阅this Code Project article 了解自定义编组。这可能是一段漫长的旅程。
  • @red_eight:消息封送处理和 COM 封送处理不相关。

标签: c++ windows winapi message-queue


【解决方案1】:

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

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

对于包含指针的自定义消息,操作系统无法自动为您编组数据,因此您必须执行自己的自定义编组。

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

【讨论】:

  • @c00000fd:嗯,还有一些其他的事情会使解释变得比这更复杂。例如,句柄不一定是指针,但它们引用的内容可能特定于线程或进程。在编组和随后解组某些内容的过程中,可能必须在接收端创建新资源以使这些句柄有意义。所以真的,any 类型的引用可能必须特别处理。 Microsoft 可能假设个人熟悉通用计算机科学概念。
  • 至少可以说,对 marshaling 一词的这种解释是相当做作的。微软干得好!
【解决方案2】:

考虑一件根本不同的事情,即单独的 Win32 进程使 IPC 变得复杂......它们的地址空间。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-22
    • 2011-03-14
    • 2012-02-29
    • 2014-10-16
    • 1970-01-01
    • 2022-10-24
    相关资源
    最近更新 更多