关于用户界面:如何在上作为服务运行Windows GUI应用程序?

How can I run a Windows GUI application on as a service?

我有一个现有的GUI应用程序,应该作为服务实现。基本上,我需要能够远程登录和注销Windows2003服务器,并保持这个程序的运行。

这是可能的吗?

编辑:在此进一步细化…我没有源,这不是我的应用程序。


Windows服务不能有gui,因此您需要去掉gui或将应用程序分成两部分-一个没有ui的服务和一个"控制器"应用程序。如果您有源代码,将非GUI代码转换为服务很容易——Visual Studio有一个"Windows服务"项目类型,它负责为您进行包装,还有一个简单的演练,演示如何创建一个将负责安装的部署项目。

如果您选择第二个路由,并且需要将一些原始的GUI代码放入控制器,则控制器和服务可以通过WCF,.NET远程处理或纯套接字连接与您定义的协议进行通信。如果您使用远程处理,请确保使用一个"厚重"的接口来传输尽可能少的方法调用数据-每个调用都有相当多的开销。

如果用户界面相当简单,那么您可以不必使用配置文件作为输入和日志文件,也可以使用Windows事件日志作为输出。


是否有人使用过第三方产品,如:始终向上?

似乎在做我需要的。它能够在我需要的登录/注销周期中持续运行。并且能够忽略它是一个GUI应用程序并运行它。

他们必须手动链接到exe并调用winmain或其他东西。


您可以将它包装成srvany,尽管您可能需要为它分配一个实际的用户帐户(与localservice或某些类似的帐户不同)。


我对温斯有很好的经验。我可以很容易地将批处理文件转换为使用它的服务。

根据这个答案,我也把它用于nginx。


你真的需要它作为一个服务运行吗,或者你只是需要它在你没有连接的时候保持运行吗?如果是后者,您可以断开连接而不是注销,应用程序将继续运行。选择关机后,该选项应在下拉列表中,或者您可以调用tsdiscon.exe。


FireDaemonPro将大多数图形用户界面应用程序转变为服务;这不是免费的,但可能值得一试。


您可以使用Servicemill来完成此操作。基本上,您在服务器上安装ServiceMill服务器。然后单击可执行文件上的右键,然后单击"作为服务安装"。接下来,您将配置一些东西(用户/密码,如果您想与桌面交互,或者如果您想隐藏UI…并将启动模式设置为自动)。

另一个来自active+软件的工具可以是一个解决方案servicemill exe builder,它允许您从命令行创建服务,如果您使用持续集成服务器,或者如果您计划将组件作为服务分发,而不必考虑服务集成(加上它是免版税的)。


如果创建一个服务会发生什么。该服务配置为与桌面交互。将其配置为运行某个用户并自动启动。来自此其他应用程序上的服务CreateProcess。我猜这很快就可以用C(C/C + +)代码,如果我记得的话,即使是一个服务也有很多代码。这样行吗??

但是!

我的第一个想法是在服务器类虚拟主机(如虚拟服务器、虚拟机、vmware)中创建虚拟计算机。这些虚拟机将作为服务运行(或者无论HyperV做什么)。虚拟机将始终在运行-无论是登录还是注销。

让这个虚拟计算机自动登录到Windows(TweakUI可以设置它),然后使用启动文件夹的快捷方式启动GUI应用程序。你甚至可以使用程序的图形用户界面(我敢打赌永远都不能做到这一点)。


一个服务不应该有一个GUI,因为它应该在不需要任何用户干预的情况下运行,并且在查找和与正确的用户桌面通信时存在各种各样的问题。

因为,可能要求这样做的原因是能够远程监控应用程序,所以实现这一点的方法是拥有两个应用程序。服务端(基本上写为控制台应用程序)和客户机/监控GUI端。服务将使用一些远程连接(当我这样做时,我使用命名管道)与客户机/监控应用程序通信。任何一个都应该能够在没有另一个的情况下运行,当然,服务应该能够在没有客户机的情况下运行。


首先,我必须问一下为什么您的服务需要用户界面。很可能不是,但您可能需要一个从该服务获取数据的客户机。服务通常没有GUI的原因是它们可能没有运行的窗口环境。服务可以在没有用户登录到计算机的情况下启动和运行。在这种情况下,没有桌面可供服务GUI运行。

已经说过,可以根据马克的建议,将服务的属性设置为以用户身份运行。您还可以在服务的属性中指定"允许服务与桌面交互"。只有当您知道某个用户将登录时才执行此操作。


你有消息来源吗?在许多情况下,独立应用程序和服务之间的差异是最小的。

大多数更改都与正确地将代码挂接到服务管理器有关。一旦完成,您将知道发生的任何问题都是您的编程的结果,而不是任何其他程序的结果。