2015-03-18 13 views
6

Tôi có một ứng dụng vcl nhỏ trong delphi chạy với đặc quyền quản trị, ứng dụng này chỉ nhận tin nhắn và các sự kiện chuột chọc. Ứng dụng thứ hai chạy với các cá nhân người dùng thông thường (thấp hơn lần đầu), ứng dụng này không thể gửi tin nhắn đến ứng dụng đầu tiên. Im chắc chắn rằng nguyên nhân là mức độ đặc quyền, cao và thấp, bởi vì nếu tôi chạy cả với thấp hơn hoặc cao hơn, họ liên lạc với thành công. Làm thế nào tôi có thể thực hiện IPC nơi tôi có thể gửi tin nhắn đến ứng dụng cấp cao hơn từ ứng dụng cấp thấp nhất? Hoặc không thể?Delphi - Liên lạc quy trình giữa các quy trình cấp thấp hơn và cao hơn

Đây là cách mà tôi sử dụng để gửi tin nhắn:

Ứng dụng cao hơn sử dụng mã này để xử lý winapi.messages:

procedure TfrMouseDriver.WMCopyData(var Message: TWMCopyData); 
var 
    S: WideString; 
    cmd, sX, sY: String; 
    s2,F: String; 
    WParam: WideString; 
    i, z, X, Y: integer; 
begin 
    X := 1; 
    Y := 1; 
    if true then 
    begin 
    s:= PWideChar(Message.CopyDataStruct.lpData); 
    s2:= PChar(Message.CopyDataStruct.lpData); 
    ... 

Và việc áp dụng mức thấp nhất gửi tin nhắn với cách này:

procedure TfrPenDriver.btnIPCClick(Sender: TObject); 
var 
    CopyData: CopyDataStruct; 
    hMouse : HWND; 
    Msg : WideString; 
begin 

    Msg := 'CM_MOVE:000500:000230'; 

    hMouse := FindWindow(PCHAR('TfrMouseDriver'),nil); 

    if hMouse > 0 then 
    begin 
    CopyData.dwData := 0; 
    CopyData.lpData := PWideChar(Msg); 
    CopyData.cbData := (1 + Length(Msg))*SizeOf(WideChar); 
    Winapi.Windows.SendMessage(hMouse, WM_COPYDATA, 0, LPARAM(@CopyData)); 
    end; 
end; 

Tôi đang tìm cách để thực hiện IPC giữa các ứng dụng này với các cấp độ người dùng khác nhau, nơi mức thấp nhất cần gửi đến ứng dụng cấp cao hơn.

+0

UIPI chặn bạn. Bạn có thể sử dụng ['ChangeWindowMessageFilterEx'] (https://msdn.microsoft.com/en-us/library/windows/desktop/dd388202.aspx), nhưng hãy cẩn thận về các tác động bảo mật. Bạn cũng có thể xem xét một cơ chế IPC khác. –

+0

Lưu ý rằng VCL cũng sử dụng 'WM_COPYDATA' bên trong, vì vậy bạn nên gán một ID duy nhất cho trường' CopyData.dwData' và sau đó tìm ID đó trong trình xử lý tin nhắn của bạn. Nếu bạn thấy một ID mà bạn không nhận ra, hãy chuyển tin nhắn đó tới trình xử lý mặc định. Nhưng có, bạn cần phải làm cho ứng dụng nâng cao cho phép 'WM_COPYDATA' thông qua bộ lọc UIPI hoặc sử dụng IPC khác, chẳng hạn như ổ cắm, ống có tên hoặc mailslot. –

Trả lời

2

Mailslots cho giao tiếp giữa các máy nội bộ là đặt cược tốt nhất của bạn do sự đơn giản của chúng và chúng được thực hiện thông qua trình điều khiển trong Windows, như đường ống. Trình điều khiển này là msfs.sys trên các hệ thống dựa trên NT. Bạn không cần bất kỳ đặc quyền đặc biệt nào được kích hoạt hoặc để tạo ra các mailslots, đọc/ghi cho chúng vv và chúng hoạt động với bất kỳ loại quy trình, cấp ứng dụng và trong bất kỳ phiên ngoại quốc nào.

Xử lý cửa sổ (HWND) là phiên cụ thể và sẽ không hoạt động trên các phiên người dùng khác. hệ thống có thể là một vấn đề.

Một lý do khác khiến WM_COPYDATA không tuyệt vời ... Giả sử bạn đang chạy mã thực thi bên trong ngữ cảnh của quá trình khác (nói quy trình hệ thống như csrss) không phải là quá trình "tương tác". Có lẽ bạn đã tiêm một DLL và muốn gửi một thông điệp IPC với WM_COPYDATA ... Bạn có thể mong đợi quá trình sụp đổ hoặc tùy thuộc vào quan trọng của các quá trình này, mong đợi một BSOD. Điều này xảy ra vì các quá trình này không đánh giá cao các cuộc gọi API user32.dll như SendMessage, mà WM_COPYDATA là một hệ thống IPC, dựa vào.

Stick để mailslots.

Các vấn đề liên quan