Delphi由于VCL控件资源很丰富,在设计界面时很容易设计出相当漂亮的界面效果,但其对计算机底层的操作支持却相当有限(像编写驱动之类的)。在底层设计上VC却是不二的选择,但是界面设计起来,却费时费力。通过使用CopyData消息来进行Delphi和VC之间的数据处理,就可以兼容二者的优点,达到最好的设计效果。同时程序又能更好模块化。下面就为大家简单介绍一下具体的操作过程。
此任务主要涉及的API函数为FindWindow和SendMessage.
Delphi端:
第一步:在工程中定义你数据共享的存储结构。如下:
type
PRec=^TRec;
TRec=record
id: Integer;
len:Integer;
Buf:Array[0..1024] of Byte;
end;
第二步:在函数定义区定义消息接收处理函数:
{ Public declarations }
procedure receive(var msg:TWMCopyData);message WM_COPYDATA;
第三步:编写函数体:
procedure TMainForm.receive(var msg:TWMCopyData);
var
i:integer;
len:integer;
tmp:string;
begin
Memo.Lines.Add('received.....');
Memo.Lines.Add('id='+IntToStr(PRec(msg.CopyDataStruct^.lpData)^.id));
len:=PRec(msg.CopyDataStruct^.lpData)^.len;
Memo.Lines.Add('len='+IntToStr(len));
tmp:='';
for i := 0 to len - 1 do
begin
tmp:=tmp+IntToStr(PRec(msg.CopyDataStruct^.lpData)^.Buf[i])+' ';
end;
Memo.Lines.Add(tmp);
end;
第四步:实现消息发送部分:
procedure TMainForm.Button1Click(Sender: TObject);
var
ds: TCopyDataStruct;
handle:HWND;
rec:PRec;
i:Integer;
begin
GetMem(rec,SizeOf(TRec));
rec.id:=1;
rec.len:=10;
for i := 0 to rec.len - 1 do
begin
rec.Buf[i]:=i;
end;
ds.cbData:=SizeOf(TRec);
ds.lpData:=rec;
handle:=FindWindow(nil,'VC_Message');
if handle<>0 then
begin
SendMessage(handle,WM_COPYDATA,0,Cardinal(@ds));
end;
FreeMem(rec,SizeOf(TRec));
end;
浙公网安备 33010602011771号