【问题标题】:Windows Messages PrivilegesWindows 消息权限
【发布时间】:2013-04-08 14:32:05
【问题描述】:

什么是 Windows 消息权限?

在Application 1中,我给Application 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');

为什么会这样?

我不能重新绘制备忘录,也不能访问文本属性。

【问题讨论】:

    标签: windows delphi privileges windows-messages


    【解决方案1】:

    您不能在应用程序之间共享对象。甚至指针也会指向目的地的地址空间。
    也许WM_COPYDATA 会满足您复制数据的要求。

    【讨论】:

    • 没有办法序列化对象吗?
    【解决方案2】:

    拥有特权的不是消息,而是进程。该功能称为User Interface Privilege Isolation (UIPI)。此功能会阻止较低完整性级别的进程向较高完整性级别的进程发送消息。

    但这不是你的问题。您的问题是每个进程都有一个单独的地址空间。因此,来自一个进程的指针在另一个进程中没有任何意义。这就是您遇到访问冲突的原因。您收到的指针指向不同进程中的内存,因此没有意义。

    您需要使用进程间通信 (IPC) 机制。例如,发送WM_COPYDATA 消息,或者命名管道,或者套接字等等。

    【讨论】:

    • 没有办法序列化对象吗?
    • 请不要转移话题。你问了这个问题,我们回答了这个问题。如果你改变问题,我们的努力就白费了。
    • @MatheusFreitas 你可以随时问另一个问题;)
    猜你喜欢
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    • 2020-01-28
    相关资源
    最近更新 更多