1.发送消息程序A,关键代码:
procedure TForm2.Button1Click(Sender: TObject);
var
   H:HWND;
begin
  str:='哈哈哈';
  H:=FindWindow('TForm1','Form1');
  sendMessage(H,UWM_SHOWTEXT ,Integer(@str),0);
end;2.接收消息程序B,关键代码:
procedure UWMShowText(var Msg:TMessage); message UWM_SHOWTEXT;
 
procedure TForm1.UWMShowText(var Msg:TMessage);
begin
  Edit1.Text:= String(Pointer(Msg.wParam)^);
end;
============================
这段代码如果都放到一个程序中执行能够得到正确结果,但在两个程序间执行时,Edit接收不到正确的字条串,请问高手如何解决???

解决方案 »

  1.   

    用Delphi实现程序间的数据传递在实际应用中,我们经常需要多个程序相互配合来完成某些特定功能。例如两个应用程序间的同步、互斥;应用程序在起第二份实例时的参数自动传递…。要实现这些功能,就必须能实现程序间的数据传递。有些特殊的高级技术可在不同的程序间传递数据,如剪贴板、动态数据交换以及 OLE自动化,但有条件限制并且相对较复杂。这里,我介绍三种有效的底层技术,希望对编程爱好者有所帮助。利用 WM_COPYDATA消息 
     使用该消息涉及一个 TcopyDataStruct结构类型的指针。该结构中有三个成员:dwData 是一个 32位的附加参数cbData 表示要传递的数据区的大小lpData 表示要传递的数据区的指针下面举个例子。该例子由两个程序构成,分别为 SendData和 GetData。SendData程序向 GetData程序发送消息,并传递 edit1中的字符串; GetData在收到消息后,把 SendData发送的字符串接受下来,并显示在相应的 edit1中。SendData程序: 
    ……varForm1: TForm1;implementation{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);vards: TCopyDataStruct;hd: THandle;beginds.cbData := Length (Edit1.Text) + 1;GetMem (ds.lpData, ds.cbData ); //为传递的数据区分配内存 StrCopy (ds.lpData, PChar (Edit1.Text));Hd := FindWindow (nil, 'Form2'); // 获得接受窗口的句柄 if Hd <> 0 thenSendMessage (Hd, WM_COPYDATA, Handle,Cardinal(@ds)) // 发送 WM_COPYDATA消息 elseShowMessage ('目标窗口没找到! ');FreeMem (ds.lpData); //释放资源 end;GetData程序: 
     TForm2 = class(TForm)Edit1: TEdit;private{ Private declarations }publicprocedure Mymessage(var t:TWmCopyData);message WM_COPYDATA;{ Public declarations }end;varForm2: TForm2;implementationprocedure TForm2.Mymessage(var t:TWmCopyData);beginEdit1.text:=StrPas(t.CopyDataStruct^.lpData);//接受数据并显示。end;使用这种方法是 WIN32应用程序进行交互的最简单的方法。
      

  2.   

    说了,用消息了。那就用SendMessage函数嘛。procedure TNC_GFYL_YBJK.SendWMCopyData(AFormCalssName, AMsg: String);
    var
      SendData: tagCOPYDATASTRUCT;        //TFormzycyjs
    begin
      //if GetLastError = ERROR_ALREADY_EXISTS then
      begin
        with SendData do
          begin
            cbData := Length(AMsg) + 1;
            GetMem(lpData, cbData); //为传递的数据区分配内存
            StrCopy(lpData, PChar(AMsg));
          end;    //TFormzycyjs 是前台住院结算窗口的类名
        SendMessage(FindWindow(pchar(AFormCalssName),nil), WM_COPYDATA, 0, integer(@SendData));
        Application.ProcessMessages;
        FreeMem(SendData.lpData); //释放资源
      end;
    end;
    接受procedure TFormzycyjs.WMCopyData(var Msg: TWMCopyData);
    var
      str: string;
    begin
      str := Trim(strpas(Msg.CopyDataStruct.lpData));
      StatusBar.Panels[1].Text:=str;
      StatusBar.Refresh;
    end;