两个应用程序消息通信的问题

tianjin 2008-05-29 06:21:45
接收的程序
unit Unit1;

interface

uses
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;

interface

uses
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种发送 发送时接收程序提示错误或者接收到的内容是错误的,是不是内存访问有限制?我要实现两个应用程序间消息的通信应如何做,谢谢
...全文
177 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
lake_cx 2008-05-30
  • 打赏
  • 举报
回复
定义MSG_USERDEFINE = WM_COPYDATA不就行了么?
shuihan20e 2008-05-30
  • 打赏
  • 举报
回复
僵哥就是僵哥啊
gyk120 2008-05-30
  • 打赏
  • 举报
回复
恩,僵哥说的有道理,推荐僵哥的方法
RamDisk比较简单易用,比我的方法好一些
僵哥 2008-05-30
  • 打赏
  • 举报
回复
4楼的方法是可以,不过需要注意内存的回收。其实用WM_COPYDATA就可以了,自己定义一个结构,从中加一个标识,用于区分具体是什么数据,这样内存管理相对简单一点。另外还有一种方法,那就是安装一个RamDisk(MSDN上可以找到源代码和示例程序),这样子就可以通过文件交换来完成,都是在内存,但是就方便很多。
僵哥 2008-05-30
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 shuihan20e 的回复:]
引用 2 楼 Adayuer 的回复:
开辟共享内存。

a给b发消息说我数据准备好了你去取吧, b 收到后去取数据,然后发消息告诉a说取完了。

你 COPYDATA 在进程间是受限制的。


既然可以开辟共享内存,也可以通过文件来通讯
[/Quote]
效率是不一样的。
shuihan20e 2008-05-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 Adayuer 的回复:]
开辟共享内存。

a给b发消息说我数据准备好了你去取吧, b 收到后去取数据,然后发消息告诉a说取完了。

你 COPYDATA 在进程间是受限制的。
[/Quote]

既然可以开辟共享内存,也可以通过文件来通讯
gyk120 2008-05-29
  • 打赏
  • 举报
回复
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;
tianjin 2008-05-29
  • 打赏
  • 举报
回复
如何开辟共享内存呢?
大大怪老张 2008-05-29
  • 打赏
  • 举报
回复
开辟共享内存。

a给b发消息说我数据准备好了你去取吧, b 收到后去取数据,然后发消息告诉a说取完了。

你 COPYDATA 在进程间是受限制的。
僵哥 2008-05-29
  • 打赏
  • 举报
回复
是.

5,927

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧