在Vista之前的Windows版本中,您可以让Windows服务与当前登录的桌面用户进行交互,以便在屏幕上轻松显示来自该服务的信息。在Windows Vista中,为了安全起见,添加了会话0,以便将服务与桌面隔离。在Session 0外部运行的服务和应用程序之间进行通信的简便方法是什么?到目前为止,我已经通过使用TCP/IP在两者之间通信来解决这个问题,但这似乎是一种草率的方式。
发布于 2008-09-11 01:48:14
您还可以使用共享内存或命名管道来促进IPC。从概念上讲,这类似于TCP/IP,但您不必担心查找未使用的端口。
您必须确保您创建的命名对象以“全局\”为前缀,以允许所有会话访问它们,如here所述。
AFAIK服务无法再直接与桌面交互。
发布于 2008-09-11 01:57:29
事实上,出于安全原因,不再可能直接与“桌面”通信。当你生活在一台有多个活动用户+远程会话的机器上时,“桌面”到底是什么?
解决这个问题的一般方法是使用服务应用程序,这些应用程序通过某种远程过程调用机制(TCP/IP、IPC、.Net远程处理通道等)进行通信。这是一种痛苦,但我认为这样的改变是值得的。
发布于 2008-09-11 02:31:04
对于要与桌面对话的服务,您很可能需要使用其中一种RPC机制。为此,.NET远程处理机制(IpcServerChannel)并不难实现。
此外,使用.NET,桌面应用程序可以通过ServiceController.ExecuteCommand直接向服务发送消息。这些命令由服务通过ServiceBase.OnCustomCommand接收。这甚至更容易做到,如果控制服务是您唯一的需求,那么这将是您所需要的。
https://stackoverflow.com/questions/55639
复制相似问题