我的想法是
能不能用SendMessage或PostMessage 发送消息(包含字符串的头地址),收到消息后,再去那个地址取字符串!

解决方案 »

  1.   

    发送消息例子:
    procedure TfrmMain.SendWinMessage (msg : string);//msg为要发送的消息
    var
      copyData : TCopyDataStruct;
      hwnd : THandle;
    begin
      copyData.cbData := Length (msg) + 1;
      GetMem (copyData.lpData,copyData.cbData);
      StrCopy (copyData.lpData,PChar (msg));
      hwnd := FindWindow (nil,PChar ('目标程序的标题'));
      if hwnd <> 0 then
        SendMessage (hwnd,WM_COPYDATA,Handle,Cardinal(@copyData))
      FreeMem (copyData.lpData);
    end;接收消息例子:
    procedure ReceiveWinMessage (var copyData:TWmCopyData);message WM_COPYDATA;
    ...
    procedure TfrmMain.ReceiveWinMessage (var copyData:TWmCopyData);
    var
      rcvBuf : string;
    begin
      rcvBuf := StrPas (copyData.CopyDataStruct^.lpData);
      showmessage ('收到消息:'+rcvBuf);
    end;
      

  2.   

    呵呵可以啊,
    unit sendunit;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Buttons;type
      TForm1 = class(TForm)
        Edit1: TEdit;
        Label1: TLabel;
        BitBtn1: TBitBtn;
        procedure BitBtn1Click(Sender: TObject);
      private
        { Private declarations }
      public
        procedure SendData;
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}
    procedure TForm1.SendData; //发送消息和数据过程
    var
    Copydatastruct: TCopyDataStruct; //定义一个Tcopydatastruct类型的变量
    hwnd: THandle; //句柄类型,用于存储目标对象的句柄
    begin 
    Copydatastruct.cbData := Length (Edit1.Text) + 1; //为传递的数据区分配内存并把要传送的字符串放入数据区
    GetMem (Copydatastruct.lpData, Copydatastruct.cbData ); 
    StrCopy (Copydatastruct.lpData, PChar (Edit1.Text)); // 获得接收窗口的句柄
    Hwnd := FindWindow (nil, '利用WM_COPYDATA进行数据交换演示Receive ');// 如果目标对象存在,则向其发送WM_COPYDATA消息
    if Hwnd <> 0 then 
    SendMessage (Hwnd, WM_COPYDATA, Handle, Cardinal(@Copydatastruct)) 
    else 
    ShowMessage ('目标对象窗口没找到!'); //释放资源
    FreeMem (Copydatastruct.lpData); 
    end;procedure TForm1.BitBtn1Click(Sender: TObject);
    begin
     if Edit1.Text<>'' then
      SendData;
    end;end.
    ///////////////////////////////////////////////////////////////////////////
    unit Receiveunit;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Buttons;type
      TForm1 = class(TForm)
        Edit1: TEdit;
        Label1: TLabel;
      private
        { Private declarations }
      public
        procedure Capturemessage(var CopyData:TWmCopyData);message WM_COPYDATA;
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}
    procedure TForm1.Capturemessage(var CopyData:TWmCopyData);
    begin 
      Edit1.text:=StrPas(CopyData.CopyDataStruct^.lpData);//接收数据获取数据并显示 
    end;
    end.
      

  3.   

    方法1:使用WM_CopyData消息实现进程间数据共享;方法2:使用内存映像文件实现数据共享;方法3:使用全局原子来实现数据共享