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.
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. –
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. –