日期:2012-04-21  浏览次数:20502 次

如何把你的应用程序作为服务来运行

by Chris J. Duke

 翻译:Atai

原创http://vbwire.com/advanced/howto/service.asp





本文章是“How—To”特别系列的第一部分。



如果你已经精通VB,并且现在你正想发布你的最后杰作作为商业软件。在最后的时间里,你们老板告诉你:你的应用程序需要在Windows NT下必须作为服务来运行。你告诉你们老板:“没问题“。于是你回到你的工作位置,然后发现你的VB程序不能做到。于是你到Microsoft Knowledge Base寻求答案,你在网上搜索,你在新闻组里搜索,最后你在这儿就特别兴奋,这儿就是VB程序如何做为服务这一系列。现在你所认为不可能的事情变得比你曾经想象的要简单。



本文章将把注意力集中到如何在Windows 95 和Windows NT3.51和或者更高版本来把你的Visual Basic4.0 或者Visual Basic5.0程序作为服务来运行。当你的应用程序作为服务时,你的应用程序能在登陆之前启动,这样你的程序能够在启动的时候运行。这样对于网络程序(比如Web服务器,邮件服务器或者是其他任何那些需要一直运行的应用程序)是很有用的。

请参看下一篇文章,这篇文章是关于如何下载一个免费的ActiveX控件加载到你的Form上马上把你的VB应用程序很简单的设置为NT 服务。



Window95

你可能要问你自己,为什么你需要把你的应用程序在Windows95上作为一个服务来运行。你也可能问是否Window95像WindowNT能够把你的应用程序作为服务来运行。

没错,Window95能够想Windows NT那样把应用程序作为服务来运行。为什么你将能够做到的理由就是你将在登陆之前启动你的应用程序。这经常会在Web服务器以及邮件服务器上使用。因为Windows 95的安全缺乏性,把你的应用程序作为服务将变的相当简单。但是这种情况对于Windows NT来说不适合(请看下面)。

在Windows95把你的应用程序作为服务来运行是很简单的。所有需要做的就是修改注册表。但是对于Windows NT来说却是一个地狱,对于Windows95,不要认为它毫无难处。本节将给你提供一个对Windows95重要的工作。

为了在Windows95中把你的应用程序作为一个服务,增加一个字符串值到你的注册表中:

HKLM\SOFTWARE\Microsoft\
Windows\CurrentVersion\RunServices

例如。假设你的应用程序叫“MicroSpud“,创建一个字符串值,值为:MircoSpud”,并且输入可执行文件的全路径到注册表的数据域中。下面是其步骤:


Step 1: 增加一个新的字符串值


Step 2: 输入可执行文件路径


Step 3: 全部完成,重新启动,MicroSpud将在登陆前启动

Windows 95托盘图标

现在你好记得在前面提到的“Quirk”吗?它在这里。如果你的应用程序启动,并且有托盘的话,你将想阅读这个对之地详细说明。

当你的应用第一个启动,你最有可能在Form_Load()或者Main()事件中添加你的托盘图标。如果通过重新启动Windows95被设为自动登陆,那么这个问题将不存在。尽管如此,当一个用户强制登陆的话,将发生以下的事情:

Windows95 启动
你的应用程序作为服务
你的应用程序视图加载托盘图标,但是失败,因为已经没有托盘图标被加载
登陆对话框出现
T用户输入用户名和密码
桌面开始加载
Y你的图标在托盘区不会出现


解决方案是重复的调用Shell_NotifyIcon()API直到它返回一个TRUE布尔值。我发现一个来实现它的解决方法是加上一个计时器。计时器初始化为启动状态,时间间隔为5秒。在调用计时器的事件(Timer1_Timer)时调用Shell_Notification()。一旦API返回TRUE值时,关闭计时器。



Window NT
你可能已经发现在Windows95中设置只需要一步,但是对于WindowsNT来说,和Windows 95完全不一样。有些人可能称之为魔鬼,这种方法能够在WindowNT3.51或者更高版本上使用。

为什么Window NT有很大的不同呢?其中的一个理由是因为所有在NT下的服务都有服务控制台(Service Control Manager ,SCM)来管理。但是你的应用程序信息仍然在注册表里。

有更多的Keys允许应用程序作为NT服务。



微软意识到这个问题不仅仅发生在VB应用程序上,而且发生在大部分应用程序上。所以微软提出一个解决方案,并且这个解决方案表现非常出色。他们开发了一个小的应用程序。这个应用程序在Windows NT资源包里发行,他们可以在章的后面可以得到。这个应用程序叫

SRVANY.EXE,对你的应用程序来说它作为一个主机(或者服务包)。换句话说,它变成一个服务程序,这个服务程序为你处理全部的苦活(Dirty Work)和以及与SCM通信。当它启动时,它到注册表找出你的应用程序的所在路径。如果找到应用程序,则启动它。使用它唯一的缺点就是当SCM关掉SRVANY时,它将使用TerminateProcess()API来杀掉你的VB应用程序。这个是一个非常不友好的方式来关闭一个应用程序。

你的应用程序作为服务的配置是直接向前的(straight forward),但是并不和Windows95那样简单。在我向你展示一步步的操作之前。理解继续做的事情非常重要。

这有两个微软开发的程序,这两个程序欺骗它。首先是我提到的SRVANY.EXE,SRVANY位于WINNT\SYSTEM32目文件夹下。你的应用程序也在这个文件夹下。在你想把你的应用程序变为服务的最后,它确实是一个“精华“,这个”精华“是一个真正的服务。当你的服务启动时,它实际上启动的是SRVANY,SRVANY将启动你的应用程序。

第二个程序是微软开发的,叫INSTSRV.EXE。这个程序安装SRVANY来作为一个服务,INSTSRV.EXE是一个通过命令行来实现其功能的。你先前使用的不在需要,除非你打算添加另外一个使用SRVANY的服务,或者是卸载先前加的服务程序。手动保持她!

SRVANY提供了一个文档没这个文档描述了你使用它的步骤。这里将指导你一步一步安装SRVANY(SRVANY是基于程序“MircoSpud“的)。

假设:

· 你作为Administator登陆,否则你将不能安装一个服务

· 你的VB应用程序“MicroSpud”位于c:\Program Files\MicroSpud\mspud.exe

· 你已经把SRVANY。EXEINSRTSRV。EXE安装到MicroSpud文件夹下



Step 1:使用INSTSRV。EXE安装SRVANY。EXE作为服务



Step 2:确认你的服务在服务控制台(控制面板)上已被加上



Step 3: 配置你的服务设置(图为缺省)

At this point, your service has been created. However, if you were to try to start it now, it would fail. You next have to tell SRVANY where your VB application resides, so it can start it when the SCM starts SRVANY. Follow these steps to complete the installation of your new service:

在这一点上,你的服务已经被创建。但是当你试着启动它时,将会失败。你下一步必须告诉SRVANY你的VB应用程序在哪里,因此当SCM启动SRVANY时SRVANY可以启动你的应用程序。下面这些步骤降教你完成你的新服务的安装。



Step 1: A 添加“Parameter”关键字

1. 启动注册表编辑器

2. 在HKLM\SYSTEM\
Curre