我正在使用Delphi创建Windows服务。我的服务需要做的基本上是开放一个程序。
在我的代码中,我正在使用WinExec(aux,SW_SHOWNORMAL);
。当我启动并运行该服务时似乎没有任何操作,但是当我查看TaskManager时,我的服务应该打开的程序在列表中,并且在用户名列中显示SYSTEM。
所以程序正在打开,但它没有显示在屏幕上。
我在谷歌做了一项研究,发现了一些像CreateProcess
这样的功能,但我不知道如何使用它。
我做错了什么?
抱歉我的英语不好。
答案 0 :(得分:7)
服务始终在会话0中运行。默认情况下,服务启动的流程在服务的会话中运行,除非服务使用CreateProcessAsUser()
在其他会话中运行流程。
在XP及更早版本中,第一个登录用户也在会话0中运行(后续用户登录在会话1+中运行)。因此,如果服务在安装时标记为Interactive,并且它运行具有UI的进程,则在会话0中运行的用户可以看到UI。
在Vista及更高版本中,这已不再可能。用户永远不再在会话0中运行,并且服务不再被标记为交互式。这称为“会话0隔离”。服务现在必须使用CreateProcessAsUser()
才能在交互式会话中运行UI流程,以便用户可以看到它。
有关详细信息,请参阅MSDN:
Impact of Session 0 Isolation on Services and Drivers in Windows
Calling CreateProcessAsUser() from service
Launching an interactive process from Windows Service in Windows Vista and later