如何用SendMessage在不同应用程序之间传送多个参数的消息

arraiy 2009-03-25 10:49:14
用SendMessage在不同应用程序之间传送消息,如何传送Record记录类型到另一个应用程序,对方如何接收,大家帮忙想想办法.
因为记录类型可以一次传递多个数据过去
...全文
319 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
preserve 2009-03-25
  • 打赏
  • 举报
回复
WM_COPYDATA
arraiy 2009-03-25
  • 打赏
  • 举报
回复
我找了些资料,看到用wm_copydata消息可以实现,但具体的怎么发送,和接收方如何接收的代码知道怎么写,有没有做过的朋友,给点例子看看,谢谢!
starluck 2009-03-25
  • 打赏
  • 举报
回复
[Quote=引用楼主 arraiy 的帖子:]
用SendMessage在不同应用程序之间传送消息,如何传送Record记录类型到另一个应用程序,对方如何接收,大家帮忙想想办法.
因为记录类型可以一次传递多个数据过去
[/Quote]

郵檂,管道。

或者采用 RegisterWindowMessage 來發送也行的。
chys3584 2009-03-25
  • 打赏
  • 举报
回复
楼上说的对,把记录写入内存映射文件中,然后发消息让另一个程序去读。
bdmh 2009-03-25
  • 打赏
  • 举报
回复
可以使用内存映射,在两个程序间共享内存
具体的可以参考<Delphi下深入Windows核心编程>的实例代码
arraiy 2009-03-25
  • 打赏
  • 举报
回复
问题解决,方法如下:

发送消息进程1:
procedure TForm1.Button1Click(Sender: TObject);
type
TT = packed record
x: integer;
y: integer;
k: ShortString;
o: real;
end;
var
A: TT;
P: TCopyDataStruct;
begin
A.x := 35;
A.y := 45;
A.k := 'abcdefg';
A.o := 12.3652;
P.dwData := i;
P.cbData := Sizeof(A);
P.lpData := @A;
SendMessage(HWND_BROADCAST, WM_COPYDATA, 1, Cardinal(@P));
end;

接收消息的进程2:
procedure TForm1.WndProc(var Message: TMessage);
type
TT = packed record
x: integer;
y: integer;
k: ShortString;
o: real;
end;
var
T: TT;
C: TCopyDataStruct;
begin
if message.Msg = WM_COPYDATA then
begin
C := TCopyDataStruct(Pointer(Message.LParam)^);
T := TT(C.lpData^);
memo1.Lines.Add('x:' + inttostr(T.x));
memo1.Lines.Add('y:' + inttostr(T.y));
memo1.Lines.Add('y:' + T.k);
memo1.Lines.Add('y:' + floattostr(T.o));
end
else
inherited;
end;
arraiy 2009-03-25
  • 打赏
  • 举报
回复
其实我的功能很简单,我就是要把进程1中的x,y,i,j,k,o(integer类型)这几个变量的值传到进程2,就是这么简单,两个进程都是我自己写的。我只要在进程1中用WM_COPYDATA发消息出来,在进程2中来识别消息是不是发给进程2的,如果是,就把数据去提取出来。

我用下面的方法试了一下,发现结果不正确,大家帮我看看:

发送消息进程1:
procedure TForm1.Button1Click(Sender: TObject);
type
TT = packed record
x: integer;
y: integer;
...
end;
var
A: TT;
begin
A.x := 23;
A.y := 34;
...
SendMessage(HWND_BROADCAST, wm_copydata, 2, integer(@A));
end;

接收消息的进程2:
procedure TForm1.WndProc(var Message: TMessage);
type
TT = packed record
x: integer;
y: integer;
...
end;
var
T: TT;
C: TCopyDataStruct;
begin
if message.Msg = WM_COPYDATA then
begin
C := TCopyDataStruct(Pointer(Message.LParam)^);
T := TT(C.lpData^);
memo1.Lines.Add('x:' + inttostr(T.x));
memo1.Lines.Add('y:' + inttostr(T.y));
...
end
else
inherited;
end;

最后得到的结果不正确,全部是大于实际数,我这种方法对不对,是不是两个进程之间这样操作有问题?
chys3584 2009-03-25
  • 打赏
  • 举报
回复
对于少量数据可以用WM_COPYDATA方便地实现通信。由于SendMessage()是阻塞的,只有接收方响应了消息,SendMessage()才能返回,否则一直阻塞。所以,对于大量数据来说,用SendMessage()就容易造成窗口假死。

SendMessage(WM_COPYDATA,wParam,lParam)

其中wParam设置为包含数据的窗口句柄,lParam指向一个COPYDATASTRUCT的结构,其定义为:

typedef struct tagCOPYDATASTRUCT{

DWORD dwData;

DWORD cbData;

PVOID lpData;

}COPYDATASTRUCT;

其中 dwData为自定义数据, cbData为数据大小, lpData为指向数据的指针。需要注意的是,WM_COPYDATA消息保证发送的数据从原进程复制到目标进程。但是,WM_COPYDATA消息不能发送HDC、HBITMAP之类的东西,它们对于目标进程来说是无效的。目标进程得到这些数据不能在原进程作任何事情,因为它们属于不同的进程。

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧