使用Winapi Sendmessage从邮件的收件人

时间:2015-11-24 15:02:15

标签: winapi messages

给定两个应用程序A和B,B需要以同步方式从A获取值。

换句话说,以对象模型为灵感,应用程序B想要做某种myVar = A.getValue()并在其余代码中使用myVar继续执行。

我拥有应用程序A主要表单的句柄,我知道如何使用SendMessage()向其发送消息。此函数等待消息继续,然后返回一个整数,该整数是执行的结果。但我不知道如何使用这种机制,以便B获得一些复杂的数据结构(字符串或数据记录)。

在我看来,使用SendMessage返回值并不是一个好主意,原因很多,所以有没有办法做到这一点?

必须通过Windows消息完成(我已经知道如何通过管道和套接字完成)。

谢谢!

PS:我使用Delphi,但这里没有重要意义,除非你能用Delphi中的例子说明你的答案:)

2 个答案:

答案 0 :(得分:1)

消息的返回值是LRESULT,它是指针大小的值。如果您希望返回的内容符合这样的值,那将是一种干净的方式。否则你需要别的东西。

您说您必须使用Windows消息,并且您要在不同进程之间发送这些消息。鉴于这些限制,只有一个解决方案,即WM_COPYDATA。这是唯一可以跨进程边界封送自定义数据的Windows消息。

所以程序如下:

  1. 从流程B向流程A发送消息。在流程B中包含一个窗口句柄。
  2. 当进程A收到消息时,它必须向第1阶段发送的窗口句柄发送WM_COPYDATA
  3. 然后,进程B可以接收并处理第2阶段发送的消息。
  4. 请注意,当进程A处理原始消息时,WM_COPYDATA消息从进程A发送到进程B.这意味着在从B到A的原始消息返回之前,进程B接收并处理WM_COPYDATA。这可能有些令人困惑,但您确实声明要完全使用Windows消息执行此操作。

答案 1 :(得分:0)

这可以通过一个进程执行VirtualAllocEx()以在另一个进程中分配内存,然后使用Read / WriteProcessMemory在那里复制数据来完成。