在实际应用中,我们经常需要多个程序相互配合来完成某些特定功能,这就需要利用数据传递来实现,利用WM_COPYDATA消息可以方便的解决这类问题。
使用该消息涉及一个TcopyDataStruct结构类型的指针。该结构中有三个成员:
dwData 是一个32位的附加参数
cbData 表示要传递的数据区的大小
lpData 表示要传递的数据区的指针
下面举例说明。该例子由两个程序构成,分别为SendData和GetData。
SendData程序向GetData程序发送消息,并传递edit1中的字符串;GetData在收到消息后,把SendData发送的字符串接受下来,并显示在相应的edit1中。
SendData程序:
……var Form1: TForm1;implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var ds: TCopyDataStruct;
hd: THandle;
begin
ds.cbData := Length(Edit1.Text) + 1;
GetMem(ds.lpData, ds.cbData); //为传递的数据区分配内存
StrCopy(ds.lpData, PChar(Edit1.Text));
Hd := FindWindow(nil, 'Form2'); // 获得接受窗口的句柄
if Hd <> 0 then
SendMessage(Hd, WM_COPYDATA, Handle, Cardinal(@ds)) // 发送WM_COPYDATA消息
else
ShowMessage('目标窗口没找到!');
FreeMem(ds.lpData); //释放资源
end; GetData程序:
TForm2 = class(TForm)
Edit1: TEdit;
private
{ Private declarations }
public
procedure Mymessage(var t: TWmCopyData); message WM_COPYDATA;
{ Public declarations }
end;
var Form2: TForm2;
implementationprocedure
TForm2.Mymessage(var t: TWmCopyData);
begin Edit1.text := StrPas(t.CopyDataStruct.lpData); //接受数据并显示。
end;
使用该消息涉及一个TcopyDataStruct结构类型的指针。该结构中有三个成员:
dwData 是一个32位的附加参数
cbData 表示要传递的数据区的大小
lpData 表示要传递的数据区的指针
下面举例说明。该例子由两个程序构成,分别为SendData和GetData。
SendData程序向GetData程序发送消息,并传递edit1中的字符串;GetData在收到消息后,把SendData发送的字符串接受下来,并显示在相应的edit1中。
SendData程序:
……var Form1: TForm1;implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var ds: TCopyDataStruct;
hd: THandle;
begin
ds.cbData := Length(Edit1.Text) + 1;
GetMem(ds.lpData, ds.cbData); //为传递的数据区分配内存
StrCopy(ds.lpData, PChar(Edit1.Text));
Hd := FindWindow(nil, 'Form2'); // 获得接受窗口的句柄
if Hd <> 0 then
SendMessage(Hd, WM_COPYDATA, Handle, Cardinal(@ds)) // 发送WM_COPYDATA消息
else
ShowMessage('目标窗口没找到!');
FreeMem(ds.lpData); //释放资源
end; GetData程序:
TForm2 = class(TForm)
Edit1: TEdit;
private
{ Private declarations }
public
procedure Mymessage(var t: TWmCopyData); message WM_COPYDATA;
{ Public declarations }
end;
var Form2: TForm2;
implementationprocedure
TForm2.Mymessage(var t: TWmCopyData);
begin Edit1.text := StrPas(t.CopyDataStruct.lpData); //接受数据并显示。
end;
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货