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;

 

 

posted on 2012-12-05 17:44  理查德.张  阅读(379)  评论(0)    收藏  举报