创建Windows服务以打开程序 - Delphi

时间:2012-08-10 18:32:09

标签: delphi windows-services

我正在使用Delphi创建Windows服务。我的服务需要做的基本上是开放一个程序。 在我的代码中,我正在使用WinExec(aux,SW_SHOWNORMAL);。当我启动并运行该服务时似乎没有任何操作,但是当我查看TaskManager时,我的服务应该打开的程序在列表中,并且在用户名列中显示SYSTEM。

所以程序正在打开,但它没有显示在屏幕上。 我在谷歌做了一项研究,发现了一些像CreateProcess这样的功能,但我不知道如何使用它。 我做错了什么?

抱歉我的英语不好。

1 个答案:

答案 0 :(得分:7)

服务始终在会话0中运行。默认情况下,服务启动的流程在服务的会话中运行,除非服务使用CreateProcessAsUser()在其他会话中运行流程。

在XP及更早版本中,第一个登录用户也在会话0中运行(后续用户登录在会话1+中运行)。因此,如果服务在安装时标记为Interactive,并且它运行具有UI的进程,则在会话0中运行的用户可以看到UI。

在Vista及更高版本中,这已不再可能。用户永远不再在会话0中运行,并且服务不再被标记为交互式。这称为“会话0隔离”。服务现在必须使用CreateProcessAsUser()才能在交互式会话中运行UI流程,以便用户可以看到它。

有关详细信息,请参阅MSDN:

Session 0 Isolation

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

CreateProcessAsUser function