【问题标题】:Why can't I use a UI component (Windows form) inside of a Windows service?为什么我不能在 Windows 服务中使用 UI 组件(Windows 窗体)?
【发布时间】:2010-07-20 21:16:57
【问题描述】:

我看过几篇文章,基本上都声明 UI 组件不应该作为服务运行。我理解没有人可以响应 UI 事件等的合理性。但事实仍然是许多自动化任务只能通过 Windows 表单实现。

这里有几个很好的例子:

  1. 我想构建一个 url 爬虫 制作缩略图的服务 网页。目前我唯一的方法 看到实现这一目标是尝试和 自动化 .Net WebBroswer 组件。

  2. 自动打印 MS-Word 文档。

Vista 之前有一些技巧可以解决这个问题,但现在没有了。我的问题是为什么会出现这种情况,人们真的有什么选择?

【问题讨论】:

    标签: winforms windows-services automation


    【解决方案1】:

    查找Shatter AttacksSession 0 Isolation Feature

    基本上,如果两个进程(不同用户的)共享同一个桌面,一个进程可能会通过发送 Windows 消息在另一个进程中执行它想要的任何代码,这被称为 Shatter Attack。

    关于这是否是设计错误引起了很多讨论,在 Vista 之后,微软决定删除对服务的任何交互式桌面支持,因为这是一个潜在的安全漏洞。

    作为替代方案,您可以考虑以有权访问交互式桌面的登录用户身份运行图像生成/打印代码。

    【讨论】:

      【解决方案2】:

      就像白痴所说,最好的办法是不要将其作为服务运行。

      但是也许您仍然无法从服务中运行它,因为您需要从某种现有的框架中运行您的代码。

      因此,解决方法是编写一个以登录用户身份运行的服务器程序。您将从必须所在的代码中访问该服务器程序一项服务。服务器将完成工作并返回结果。

      您可以使用 WCF 在命名管道上作为传输或任何有效的方式在 2 之间进行通信。如果没有,您可以使用裸命名管道,或者 localhost 上的 tcp/ip。从您的用户资料中的网站来看,您应该了解 localhost!

      【讨论】:

        【解决方案3】:

        从技术上讲,UI 组件需要启动 Windows 消息队列才能工作。您可以从 Windows 服务运行它(可能允许与桌面交互,据我所知,此功能在 Windows Vista 及更高版本中被禁用)。

        但是你说的不是 UI 组件,而是 COM 组件,你可以使用它。至少是 MS Office,但微软不推荐,因为内存泄漏是可能的。最新的 MS Office 有服务器版本,可以在没有用户界面的应用程序中使用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-01-12
          • 1970-01-01
          • 2012-10-15
          • 1970-01-01
          • 1970-01-01
          • 2019-12-19
          相关资源
          最近更新 更多