2

有人对 XP 下的 Windows 服务功能有很好的指南吗?特别是,我试图找出当作为服务运行的程序试图打开窗口但没有被授予与桌面交互的权限时会发生什么。

基本上,我有一个程序是/曾经是一个 GUI 应用程序,它应该能够作为长期后台处理的服务运行。重写程序以在进行后台处理时不显示 GUI 元素是一项重大工作,所以我想看看是否有一种方法可以忽略 UI 元素。只要没有打开太多窗口,它现在就可以工作了。我试图弄清楚我可能会遇到什么限制。理想情况下,会有一个 MSDN 页面讨论这个问题,但我还没有找到一个。

4

5 回答 5

8

通常,服务应设计为没有任何可见的 UI。服务的全部意义在于在后台运行,无需 UI,无人值守。(想想 SQL Server、IIS 等)

在大多数情况下,如果需要 GUI,则由单独的应用程序控制服务的操作。(继续我刚才提到的示例,SQL Server Management Studio、IIS 管理器等。)这些单独的应用程序配置和操作服务(有时,如果需要,反弹所述服务)。

如果您的服务需要偶尔的 UI,并且说 UI 不能被隔离到控制应用程序,那么您可能应该重新考虑您开始使用服务的事实。也许驻留在系统通知区域中的 UI 应用程序是正确的使用模式?(例如,Windows Live Communicator。)

于 2008-09-22T21:00:31.507 回答
2

Microsoft Windows 中的服务是在计算机运行操作系统时运行的程序。它不需要用户登录。需要服务来执行与用户无关的任务,例如目录复制、进程监控或对网络上其他机器的服务,例如支持 Internet HTTP 协议

通常它被实现为在后台运行并执行不需要用户交互的任务的控制台应用程序。

安装的服务可以通过 Control Panel --> Administrative ToolsWindows 2000/XP 中的服务小程序进行配置。

可以将服务配置为在操作系统启动时自动启动,因此您不必在系统重新启动后手动启动每个服务。

  1. 创建一个简单的服务 - MSDN 文章
  2. 轻松编写 Windows 服务 - 代码项目文章
  3. 用 C 语言编写 Windows 服务的五个步骤 - DevX 文章
于 2008-09-22T20:57:35.070 回答
1

如果选中“允许服务与桌面交互”属性(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 部分从服务中分离出来。

于 2008-09-22T21:13:53.020 回答
1

如果您考虑最终迁移到较新的操作系统,例如 Vista 或 Server 2008,您会发现根本无法授予服务与桌面交互的权限。因此,从前向兼容性的角度来看,您应该将服务设计为不需要它。

于 2008-09-22T21:04:35.973 回答
0

通常服务没有权限写入窗口站和桌面,所以会失败;即使运行加载 user32.dll 的应用程序也可能会失败,因为 user32 具有想要与窗口站对话的初始化代码,并且除非该服务以管理员身份运行,否则无法访问它。

于 2008-09-22T21:08:51.020 回答