Windows下服务可以做什么?
有没有人对XP下Windows服务的功能有很好的指导?特别是,我试图找出当一个程序作为服务运行时试图打开窗口,但没有获得与桌面交互的权限时会发生什么。
基本上,我有一个/曾经是GUI应用程序的程序,应该能够作为服务运行以进行长期的后台处理。重写程序以在进行后台处理时不显示GUI元素是一项很大的工作,因此,我想看看是否有一种忽略UI元素的方法。只要没有打开太多窗口,它现在就可以工作了。我正在尝试找出可能遇到的限制。理想情况下,将有一个讨论此问题的MSDN页面,但我还没有运气。
解决方案
Microsoft Windows中的服务是在计算机运行操作系统时运行的程序。它不需要用户登录。需要执行服务来执行与用户无关的任务,例如目录复制,进程监视或者对网络上其他计算机的服务,例如对Internet HTTP协议的支持
通常,它被实现为在后台运行的控制台应用程序,并执行不需要用户交互的任务。
可以通过服务小应用程序配置已安装的服务,该服务可从以下位置获得
Windows 2000 / XP中的"控制面板->管理工具"。
可以将服务配置为在操作系统启动时自动启动,因此我们不必在系统重新启动后手动启动每个服务。
- 创建简单服务-MSDN文章
- 轻松编写Windows服务-代码项目文章
- 用C编写Windows服务的五个步骤-DevX文章
通常,服务应设计为不具有任何可见的UI。服务的全部要点是在无人值守的情况下在后台运行,没有UI。 (考虑一下SQL Server,IIS等)
在大多数情况下,如果需要GUI,则由单独的应用程序控制服务的操作。 (继续我刚才提到的示例,SQL Server Management Studio,IIS Manager等。)这些独立的应用程序配置和操作服务(有时,如果需要,可以反弹该服务)。
如果服务需要偶尔使用UI,并且无法将UI与控件应用隔离,那么我们可能应该重新考虑使用服务的事实。也许驻留在系统通知区域中的UI应用程序是使用的正确模式? (例如Windows Live Communicator。)
如果我们打算最终迁移到较新的操作系统(例如Vista或者Server 2008),则会发现我们根本无法授予与台式机交互的服务权限。因此,从前向兼容性的角度来看,我们应将服务设计为不需要它。
通常,该服务没有写窗口站和桌面的权限,因此它将失败。即使正在运行的加载了user32.dll的应用程序也可能失败,原因仅在于user32具有要与window station对话的初始化代码,除非该服务以管理员身份运行,否则无法访问它。
如果选中了"允许服务与桌面交互"属性(MMC->服务属性->登录选项卡),则Windows XP中的服务可以与桌面交互。也可以通过执行以下操作来做到这一点:
hWinstation = OpenWindowStation("winsta0", FALSE, MAXIMUM_ALLOWED); SetProcessWindowStation(hWinstation); hDesktop = OpenDesktop("default", 0, FALSE, MAXIMUM_ALLOWED); SetThreadDesktop(hDesk);
但是请注意,在Windows XP中通过服务进程显示UI几乎总是会导致安全问题(请参阅Shatter攻击)。我们应该尝试从服务中扩展应用程序的UI部分。