消息传递中的奇怪问题急急急!!!

wgzymzx 2008-05-30 12:01:11
我想用消息的方式,来实现对其他程序运行过程的监视。
写了两个测试程序来演示,结果发现消息不能正常处理。不知道是什么原因:
消息处理端源码如下:
const
MONITOR_MESSAGE = WM_USER + 1;

type
TfrmMain = class(TForm)
memoPlain: TMemo;
memoHex: TMemo;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
procedure MonitorInfo(var Message: TMessage); message MONITOR_MESSAGE;

public
{ Public declarations }

end;

var
frmMain: TfrmMain;

implementation

{$R *.dfm}

//**:***************************************************************************
//**:功能:状态监控控制
//**:***************************************************************************
procedure TfrmMain.MonitorInfo(var Message: TMessage);
var
L_Param:string;
begin
L_Param := string(Pointer(Message.LParam));
MemoHex.Text := MemoHex.Text + L_Param;
end;

procedure TfrmMain.FormCreate(Sender: TObject);
var
f:TextFile;
begin
AssignFile(f, 'C:\MHandle.dat');
try
try
rewrite(f);
writeln(f,IntToStr(frmMain.Handle)); //将监控
except
ShowMessage('启动失败');
end;
finally
closefile(f);
end;
end;

消息发送端源码如下:
const
MONITOR_MESSAGE = WM_USER + 1;

type
TfrmMain = class(TForm)
btnSend1: TButton;
txtMsg1: TEdit;
procedure FormCreate(Sender: TObject);
procedure btnSend1Click(Sender: TObject);
private
{ Private declarations }
SvrHWD:integer;

public
{ Public declarations }

end;

var
frmMain: TfrmMain;

implementation

{$R *.dfm}

procedure TfrmMain.FormCreate(Sender: TObject);
var
f:TextFile;
fn, tmp:string;
begin
fn := 'C:\MHandle.dat';
if not FileExists(fn) then
begin
showmessage('启动失败');
exit;
end;

AssignFile(f, 'C:\MHandle.dat');
try
try
reset(f);
readln(f,tmp);
SvrHWD := StrToInt(tmp);
except
end;
finally
closefile(f);
end;
end;

procedure TfrmMain.btnSend1Click(Sender: TObject);
var
L_Param:string;
begin
L_Param := ' '+txtMsg1.Text;
postMessage(SvrHWD,MONITOR_MESSAGE,1,LongInt(Pointer(L_Param)));
end;

消息处理端,消息发送端,是两个独立的执行文件。
可是在调试的时候,发现MonitorInfo方法中总是会报内存只读错误,无法正常收到Lparam的内容。
请问高手,这是为什么,怎么解决?
...全文
86 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
gzmhero 2008-05-30
  • 打赏
  • 举报
回复
是不同的程序?

不能用消息这样的简单的来传递数据。 使用WM_COPYDATA消息、全局原子、剪贴板、动态数据交换以及OLE自动化等方法。
wgzymzx 2008-05-30
  • 打赏
  • 举报
回复
copymemory(BufParam,Pointer(Msg.LParam),iLen);
这句编译不过去,改成了
copymemory(@BufParam[0],Pointer(Message.LParam),iLen);
但还是不行,收到的内容与不是正确的内容。
是不是还有其他的什么问题呀?
gzmhero 2008-05-30
  • 打赏
  • 举报
回复
这样试试:

发送端:

var
BufParam:Array[0..1024] of char;

procedure TfrmMain.btnSend1Click(Sender: TObject);
begin
L_Param := ' '+txtMsg1.Text;
CopyMemory(@BufParam[0],pChar(L_Param),Length(L_Param));
postMessage(SvrHWD,MONITOR_MESSAGE,Length(L_Param),LParam(@BufParam[0]));
end;

接收端:
var
BufParam:Array[0..1024] of char;

procedure TfrmMain.MonitorInfo(var Message: TMessage);
var
iLen:integer;
begin
iLen:=Msg.wParam;
copymemory(BufParam,Pointer(Msg.LParam),iLen);
MemoHex.Text := MemoHex.Text + BufParam;
end;
whisht 2008-05-30
  • 打赏
  • 举报
回复

发送端:

procedure TfrmMain.btnSend1Click(Sender: TObject);
var
ds: TCopyDataStruct;
begin
ds.cbData := Length (txtMsg1.Text);
GetMem (ds.lpData, ds.cbData ); //为传递的数据区分配内存
Try
StrCopy (ds.lpData, PChar (txtMsg1.Text));
SendMessage (Self.Handle, WM_COPYDATA, Handle,
Cardinal(@ds)); // 发送WM_COPYDATA消息
End;
Finally
FreeMem (ds.lpData); //释放资源
End;
end;

接收端:

procedure MonitorInfo(var t: TWmCopyData); message WM_COPYDATA;


procedure TfrmMain.MonitorInfo(var t: TWmCopyData);
begin
MemoHex.Text := StrPas(t.CopyDataStruct^.lpData);
end;
wgzymzx 2008-05-30
  • 打赏
  • 举报
回复
哦,先研究一下

5,391

社区成员

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

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