我想用消息的方式,来实现对其他程序运行过程的监视。
写了两个测试程序来演示,结果发现消息不能正常处理。不知道是什么原因:
消息处理端源码如下:
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的内容。
请问高手,这是为什么,怎么解决?
写了两个测试程序来演示,结果发现消息不能正常处理。不知道是什么原因:
消息处理端源码如下:
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的内容。
请问高手,这是为什么,怎么解决?
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;
这句编译不过去,改成了
copymemory(@BufParam[0],Pointer(Message.LParam),iLen);
但还是不行,收到的内容与不是正确的内容。
是不是还有其他的什么问题呀?
发送端: 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;