2013-04-08 135 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