我在delphi中有一个使用管理员权限运行的小vcl应用程序,这个应用程序只接收消息并戳戳鼠标事件。 第二个应用程序使用普通用户priveleges(低于第一个)运行,此应用程序无法向第一个应用程序发送消息。 我确定原因是特权级别,更高和更低,因为如果我以更低或更高的价格运行它们,它们就会成功通信。 我如何能够在IPC中从最低级别的应用程序向更高级别的应用程序发送消息? 或者这是不可能的?
这是我用来发送消息的方式:
较高的应用使用此代码来处理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);
...
最低级别的应用程序以这种方式发送消息:
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;
我正在寻找在具有不同用户级别的应用程序之间进行IPC的方法,其中最低级别需要发送到更高级别的应用程序。
答案 0 :(得分:2)
用于本地机器进程间通信的Mailslots是最好的选择,因为它们非常简单,它们通过Windows中的驱动程序(如管道)实现。这个驱动程序是基于NT的系统上的msfs.sys。您不需要启用任何特殊权限,以便创建邮件槽,读取/写入等等,并且它们可以与任何流程类型,应用程序级别以及任何外部会话一起使用。
窗口句柄(HWND)是特定于会话的,不能在其他用户会话中工作,因此在这种情况下,使用WM_COPYDATA会遇到问题,因为它依赖于窗口句柄,并且如前所述,UIPI对更现代的Windows操作系统的限制可能是个问题。
WM_COPYDATA不太好的另一个原因是......假设您在另一个进程(比如csrss之类的系统进程)的上下文中运行可执行代码,这不是一个问题。 "互动"处理。也许你已经注入了一个DLL,想要用WM_COPYDATA发送一条IPC消息......你可以期待这个过程崩溃或者取决于过程的重要性,期望一个BSOD。发生这种情况是因为这些进程并不欣赏user32.dll API调用,例如作为IPC系统的WM_COPYDATA所依赖的SendMessage。
坚持邮寄地点。