第二个应用程序使用普通用户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,LParaM(@copyData)); end;end;
我正在寻找在这些具有不同用户级别的应用程序之间进行IPC的方法,其中最低级别需要发送到更高级别的应用程序.
解决方法 用于本地机器进程间通信的mailslots是最好的选择,因为它们简单,并且通过windows中的驱动程序(如管道)实现.这个驱动程序是基于NT的系统上的msfs.sys.您不需要启用任何特殊权限,以便创建邮件槽,读取/写入等等,并且它们可以与任何流程类型,应用程序级别以及任何外部会话一起使用.窗口句柄(HWND)是特定于会话的,不能在其他用户会话中工作,因此在这种情况下,您使用WM_copYDATA会遇到问题,因为它依赖于窗口句柄,并且如前所述,对更现代的windows *** 作系统的UIPI限制可以是问题.
WM_copYDATA不太好的另一个原因是这个…假设您在另一个进程(比如csRSS之类的系统进程)的上下文中运行可执行代码,这不是一个“交互”进程.也许你注入了一个DLL,想要发送带有WM_copYDATA的IPC消息……你可以期待这个过程崩溃或者取决于过程的重要性,期望一个BSOD.发生这种情况是因为这些进程不了解user32.dll API调用,例如作为IPC系统的WM_copYDATA所依赖的SendMessage.
坚持mailslots.
总结以上是内存溢出为你收集整理的Delphi – 较低级别和较高级别流程之间的进程间通信全部内容,希望文章能够帮你解决Delphi – 较低级别和较高级别流程之间的进程间通信所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)