并不是每个程序都能作为服务启动的,不信大家可以随便拿一个程序,添加到服务中

服务添加实际上很容易,系统已经给出了一个很简单的命令——sc

让我们来看下WIN7系统下的用法【XP中是英文】:

描述:
        SC 是用于与服务控制管理器和服务进行通信的命令行程序。
用法:
        sc <server> [command] [service name] <option1> <option2>

        选项 <server> 的格式为 "\\ServerName"
        键入 "sc [command]" 可以获得有关命令的进一步帮助
        命令:
          query———–查询服务的状态,
                          或枚举服务类型的状态。
          queryex———查询服务的扩展状态,
                          或枚举服务类型的状态。
          start———–启动服务。
          pause———–向服务发送 PAUSE 控制请求。
          interrogate—–向服务发送 INTERROGATE 控制请求。
          continue——–向服务发送 CONTINUE 控制请求。
          stop————向服务发送 STOP 请求。
          config———-更改服务的配置(永久)。
          description—–更改服务的描述。
          failure———更改服务失败时执行的操作。
          failureflag—–更改服务的失败操作标志。
          sidtype———更改服务的服务 SID 类型。
          privs———–更改服务的所需权限。
          qc————–查询服务的配置信息。
          qdescription—-查询服务的描述。
          qfailure——–查询失败时服务执行的操作。
          qfailureflag—-查询服务的失败操作标志。
          qsidtype——–查询服务的服务 SID 类型。
          qprivs———-查询服务的所需权限。
          qtriggerinfo—-查询服务的触发器参数。
          qpreferrednode–查询首选的服务 NUMA 节点。
          delete———-(从注册表)删除服务。
          create———-创建服务(将其添加到注册表)。
          control———向服务发送控制。
          sdshow———-显示服务的安全描述符。
          sdset———–设置服务的安全描述符。
          showsid———显示相应于假定名称的 SID 字符串。
          triggerinfo—–配置服务的触发器参数。
          preferrednode—设置首选的服务 NUMA 节点。
          GetDisplayName–获取服务的 DisplayName
          GetKeyName——获取服务的 ServiceKeyName。
          EnumDepend——枚举服务的依存关系。

        下列命令不要求服务名称:
        sc <server> <command> <option>
          boot————(ok | bad) 指示是否将上一次启动保存为
                          最近一次已知的正确启动配置
          Lock————锁定服务数据库
          QueryLock——-查询 SCManager 数据库的 LockStatus
示例:
        sc start MyService

创建一个服务很简单,命令格式:

sc create 【替换为服务名称,不同于显示名称,具体你在系统的服务管理中就可以看出差别了】 binpath= "【执行文件路径】" start=【初始启动状态,可选boot|system(前面几个都是较为内核的,不管)|auto|demand|disabled|delayed-auto(仅WIN7)】此外还可以加上显示名称displayname= "【显示名称】"

例如创建notepad为系统服务,并开机自动运行

sc create notepad binpath= "c:\windows\system32\notepad.exe" start= auto displayname= "notepad服务"

创建好后,在计算机管理中试图启动它,会出现什么呢?

你会发现,没反应,且在进程列表中已经有了

过了一下,会弹一个框:

内容:没有及时相应启动请求

并且在进程中消失

好了,测试完了,打扫战场,删除服务即可:

sc delete notepad【你可以注意到我用的是服务名称,不是显示名称(显示名称是用作显示的)】

PS:以上种种示例在Vista和Win7都需要管理员权限

可见,普通程序是不能直接加入服务的

从提示框我们可以看出,是因为程序没有应答SCManage的启动。打个比方,我喊你跑了,你听到了并跑了。但是却没有给我说我已经跑了,于是我认为你没有正常的跑,又叫你停下来了

怎么告诉SCManage程序已经启动了呢?C、C++都提供了很多方法,但是VB是以简单著称,最简单的方法就是使用NTSVC.OCX

安装方法:

点此下载NTSVC.OCX

解压到C:\Windows\System32

在cmd下输入regsvr32 NTSVC.OCX,即注册成功

在VB工程菜单中找到部件——找到Microsoft NT Service Control,打上勾

便会发现在左侧工具栏中多了一个齿轮标志:齿轮就是它了

拖到界面上,就可以使用了

使用方法:

先点齿轮在右侧属性写上你的服务的描述和Service name等【不填也可以,如果你想让程序自身就具备自我创建、删除服务的功能,这些必须得填】

由于程序一运行就要回应系统的“召唤”,所以我们需要在Form_Load()代码中加入一句【越快越好^_^】:

NTService1.StartService

这样,按照前面方法增加服务,启动服务,你就会发现进度条一闪就过了

如何让程序自身具备创建服务的功能呢?

很简单,首先你得判断运行你的参数,例如/install /uninstall和没有参数

    If Command = "/install" Then
        NTService1.Interactive = True
        NTService1.Install ‘【创建服务】

就像这样

没有参数就执行NTService1.StartService就好了

如果想让服务能够接受暂停和继续的命令,就加上一句:

NTService1.ControlsAccepted = svcCtrlPauseContinue

加上后,就意味着要为此写上代码

Private Sub NTService1_Pause(Success As Boolean)

‘在此加上暂停后的行为,停止做些什么

Success = True ‘返回SCM一个成功暂停服务的消息

End Sub

Private Sub NTService1_Start(Success As Boolean)

‘在此加上服务接受到继续命令后的行为

Success = True ‘返回SCM一个使服务继续运行的消息

End Sub

还有就是诸如Private Sub NTService1_Stop(),同理也就可以了

如果要让服务启动后停止,并要告诉SCM,怎么做呢?

Private Sub Form_Load()
NTService1.StartService
‘…..
NTService1.StopService
End Sub

此时运行服务,就会提示该服务启动后又停止了,而不是提示进程意外终止

End…