2013-04-08 69 views
0

什么是Windows消息权限?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'); 

为什么出现这种情况?

我都不能重画备忘录,也不能访问文本属性。

回答

5

您不能在应用程序之间共享对象。即使指针也会指向目的地的地址空间。
也许WM_COPYDATA将符合您的要求复制数据。

+0

有没有办法可以序列化对象? – EProgrammerNotFound 2013-04-08 14:41:18

+0

多数民众赞成在另一个问题... – bummi 2013-04-08 14:42:04

3

这不是具有权限的消息,而是进程。该功能被称为User Interface Privilege Isolation(UIPI)。该功能可以阻止较低的完整性级别进程向较高的完整性级别进程发送消息

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

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

+0

有没有办法我可以序列化的对象? – EProgrammerNotFound 2013-04-08 14:44:13

+0

我会改变主题... – EProgrammerNotFound 2013-04-08 14:44:36

+4

请不要改变主题。你问了这个问题,我们回答了这个问题。如果你改变了这个问题,我们的努力就被​​浪费了。 – 2013-04-08 14:45:05