2013-04-08 3 views
0

Windows 메시지 권한은 무엇입니까? 응용 프로그램 2에서Windows 메시지 권한

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

메시지 구현 : 이런 일이 발생하는 이유

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'); 

응용 프로그램 1에서

, 나는 응용 프로그램 2에 메시지를 게시?

메모를 다시 칠하거나 텍스트 속성에 액세스 할 수 없습니다.

답변

5

응용 프로그램간에 개체를 공유 할 수 없습니다. 포인터조차도 목적지의 주소 공간을 가리 킵니다.
WM_COPYDATA은 데이터 복사시 요구 사항에 부합합니다.

+0

개체를 serialize 할 수있는 방법이 없습니다. – EProgrammerNotFound

+0

다른 질문이 ... – bummi

3

권한이있는 메시지가 아니라 프로세스입니다. 기능은 User Interface Privilege Isolation (UIPI)으로 알려져 있습니다. 이 기능은 더 낮은 무결성 레벨 프로세스가 더 높은 무결성 레벨 프로세스로 메시지를 보내는 것을 중지합니다.

하지만 문제는 아닙니다. 문제는 각 프로세스마다 별도의 주소 공간이 있다는 것입니다. 그리고 한 프로세스의 포인터는 다른 프로세스의 아무 것도 의미하지 않습니다. 그래서 액세스 위반이 발생합니다. 당신이받는 포인터는 다른 프로세스에서 메모리를 가리키고 그래서 의미가 없다.

프로세스 간 통신 (IPC) 메커니즘을 사용해야합니다. 예를 들어 WM_COPYDATA 메시지 또는 명명 된 파이프 또는 소켓 등을 보냅니다.

+0

개체를 serialize 할 수있는 방법이 없습니다. – EProgrammerNotFound

+0

제목을 변경하겠습니다 ... – EProgrammerNotFound

+4

제목을 변경하지 마십시오. 당신은이 질문을했고 우리는이 질문에 대답했습니다. 질문을 변경하면 우리의 노력이 낭비됩니다. –