接收的程序
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;const
     MSG_USERDEFINE = WM_COPYDATA + 20;
     //MSG_USERDEFINE = WM_USER + 20;
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Edit1: TEdit;
    Memo1: TMemo;
    Edit2: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure  ProcessMyMsg(var Msg: TMessage); message MSG_USERDEFINE;
  end;var
  Form1: TForm1;implementation{$R *.dfm}procedure  TForm1.ProcessMyMsg(var Msg: TMessage);
var
    CDS: ^tagCOPYDATASTRUCT;
begin
    CDS := Pointer(Msg.lParam);
    Memo1.Lines.Add(StrPas(CDS.lpData));
end;
procedure TForm1.Button1Click(Sender: TObject);
var
    CDS: tagCOPYDATASTRUCT;
begin
    CDS.cbData := Length(Edit2.Text)+1;
    CDS.lpData := PChar(Edit2.Text);
    PostMessage(handle, MSG_USERDEFINE, 0, integer(@CDS));
end;procedure TForm1.FormShow(Sender: TObject);
begin
    Edit1.Text :=IntToStr(handle);
end;end.
***************************************
上面的程序自发自收没有问题发送程序
unit Unit_Sen;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
const
     MSG_USERDEFINE = WM_USER + 20;
type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Memo1: TMemo;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    aaa:string;  end;var
  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
    CDS: tagCOPYDATASTRUCT;
begin
    aaa := Memo1.Text;
    CDS.dwData := Length(aaa)+1;
    CDS.cbData := Length(aaa)+1;
    CDS.lpData := PChar(aaa);
    SendMessage(StrToInt(Edit1.Text), MSG_USERDEFINE, handle, integer(@CDS));
end;procedure TForm1.Button2Click(Sender: TObject);
var
    strMSG: string;
    Data: tagCOPYDATASTRUCT;
    pBuf: PChar;
begin
    strMSG := Memo1.Text;
    GetMem(pBuf, Length(strMSG) + 1);    try
        ZeroMemory(pBuf, Length(strMSG) + 1);
        StrPCopy(pBuf, strMSG);        Data.dwData:= Length(strMSG);
        Data.cbData:= Length(strMSG);
        Data.lpData:= pBuf;        SendMessage(StrToInt(Edit1.Text), MSG_USERDEFINE, handle, Integer(@Data));
    finally
        FreeMem(pBuf);
    end;
end;end.
****************************
2种发送 发送时接收程序提示错误或者接收到的内容是错误的,是不是内存访问有限制?我要实现两个应用程序间消息的通信应如何做,谢谢

解决方案 »

  1.   

    开辟共享内存。a给b发消息说我数据准备好了你去取吧, b 收到后去取数据,然后发消息告诉a说取完了。你 COPYDATA 在进程间是受限制的。
      

  2.   

    procedure   TForm2.BitBtn1Click(Sender:   TObject); 
    var 
            Myshm:Pshm; 
            Fhandle:string; 
            hFileMapping:   THandle; 
            Fsize:integer; 
            lp:pshm; 
    begin 
                Myshm:=Pshm(GlobalAlloc(GPTR,sizeof(Tshm))); 
                //virtualalloc(myshm,sizeof(Tshm),FILE_MAP_ALL_ACCESS,Dword(1)); 
                fillchar(Myshm^,sizeof(Tshm),#0); 
                //zeromemory(Myshm^,sizeof(Tshm));             //myshm:=nil; 
                try 
                        myshm:=readcfg1(0)   ; 
                except 
                        on   E:   Exception     do 
                                begin 
                                        showmessage(e.Message+ '::: '+Inttostr(getlasterror)); 
                                end; 
                end;             
                FHandle:= 'EEED '; 
              //   showmessage(Fhandle); 
                hFileMapping   :=   OpenFileMapping(FILE_MAP_ALL_ACCESS,   FALSE,   PChar(FHandle));             Fsize:=     sizeof(Tshm);             if   hFileMapping   =   0   then 
                        hFileMapping   :=   CreateFileMapping($FFFFFFFF,   nil,   PAGE_READWRITE     ,   0,   FSize,   PChar(FHandle)); 
                if   hFileMapping   =   0   then 
                        raise   Exception.Create( 'CreateFileMapping   failed   with   error   code   '   +   IntToStr(GetLastError)); 
                lp   :=   Pshm(MapViewOfFile(hFileMapping,   FILE_MAP_ALL_ACCESS,   0,   0,   FSize)); 
                if   lp   =   nil   then 
                        raise   Exception.Create( 'MapViewOfFile   failed   with   error   code   '   +   IntToStr(GetLastError)); 
                copymemory(lp,Myshm,Fsize);               //给共享内存赋值 
    end;
      

  3.   

    4楼的方法是可以,不过需要注意内存的回收。其实用WM_COPYDATA就可以了,自己定义一个结构,从中加一个标识,用于区分具体是什么数据,这样内存管理相对简单一点。另外还有一种方法,那就是安装一个RamDisk(MSDN上可以找到源代码和示例程序),这样子就可以通过文件交换来完成,都是在内存,但是就方便很多。
      

  4.   

    恩,僵哥说的有道理,推荐僵哥的方法
    RamDisk比较简单易用,比我的方法好一些
      

  5.   

    定义MSG_USERDEFINE = WM_COPYDATA不就行了么?