我想用消息的方式,来实现对其他程序运行过程的监视。 
写了两个测试程序来演示,结果发现消息不能正常处理。不知道是什么原因: 
消息处理端源码如下: 
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的内容。 
请问高手,这是为什么,怎么解决?

解决方案 »

  1.   

    这样试试: 发送端: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; 
      

  2.   

    copymemory(BufParam,Pointer(Msg.LParam),iLen); 
    这句编译不过去,改成了
    copymemory(@BufParam[0],Pointer(Message.LParam),iLen);
    但还是不行,收到的内容与不是正确的内容。
    是不是还有其他的什么问题呀?
      

  3.   

    是不同的程序?不能用消息这样的简单的来传递数据。 使用WM_COPYDATA消息、全局原子、剪贴板、动态数据交换以及OLE自动化等方法。
      

  4.   


    发送端: 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;