0

Windows メッセージの特権とは何ですか?

アプリケーション 1 では、アプリケーション 2 にメッセージを投稿しました。

PostMessage(handle, WM_LOCAL, 0, Integer(Lst));

アプリケーション 2 では、メッセージの実装:

var l: TStringList;
begin    
  ShowMessage('got 1');
  l := TStringList(Message.LParam);
  ShowMessage('got 2');
  Memo1.Clear;
  ShowMessage('got 3');

  if Memo1 = nil then
    ShowMessage('nil');

  //HERE : Access violation.
  //Memo1.Text := l.Text;
  //ShowMessage('got 4');

  Memo1.Lines.Add('good!');
  ShowMessage('got 5');

  l.Free;      
  ShowMessage('got 6');

  //Access violation Too..
  Memo1.Repaint;
  ShowMessage('got 7');

なぜこれが起こるのですか?

メモを再描画することも、Text プロパティにアクセスすることもできません。

4

2 に答える 2

5

アプリケーション間でオブジェクトを共有することはできません。ポインターでさえ、宛先のアドレス空間を指します。
おそらくWM_COPYDATAは、データをコピーする際の要件に適合します。

于 2013-04-08T14:39:12.613 に答える
4

特権を持つのはメッセージではなく、プロセスです。この機能は、User Interface Privilege Isolation (UIPI) として知られています。この機能は、整合性レベルの低いプロセスが整合性レベルの高いプロセスにメッセージを送信するのを停止します。

しかし、それはあなたの問題ではありません。問題は、各プロセスに個別のアドレス空間があることです。したがって、あるプロセスからのポインターは、別のプロセスでは何の意味もありません。これが、アクセス違反が発生する理由です。受け取ったポインタは別のプロセスのメモリを指しているため、意味がありません。

プロセス間通信 (IPC) メカニズムを使用する必要があります。たとえば、WM_COPYDATAメッセージの送信、名前付きパイプ、ソケットなどです。

于 2013-04-08T14:41:56.787 に答える