AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > VB编程

如何利用VB编写NT服务程序

51自学网 http://www.wanshiok.com

三、编写服务
了解以上内容,下面我们开始来设计一个服务,通过例子,让大家理解如何在 VB 中编写服务 .
在此之前,我们决定写一个什么样的服务。我参考 C++Build 中的一个例子,写一个不断报警的服务进程。该进程启动后在后台不断间隔 5 秒发出 Beep 叫,这可以让大家更深切知道此服务的存在,虽然有些令人讨厌。服务的名字为 VBBeepSVC, 在 SCM 中显示为 The VB NT SVC View 。
跟着我一起来吧!
1 、创建工程,设定相关使用到的控件。
所有的 Vb 的控件必须有一个 Form 作为载体,所以,首先我们创建一个标准工程 , 选择菜单 project—>Components…, 然后选取( Microsoft NT Service Control ) , 会在 Toolbar 中出现 NT 服务控件。再拖一个 Timer 控件到 Form 上。然后保存一下。基本上,创建过程完成。
2 、设定控件属性。
选中 NtSvc.ocx 实例,在属性栏中设定: DisplayName: The VB NT SVC View,ServiceName: VBBeepSVC,StartMode:3( 手动启动服务 ). 其他的就缺省吧。
由于我们希望每个 5 秒就 beep 一次,所以我们必须依靠一种定时机制来实现,所以我们将 timer 的 Interval 设定位 5000 毫秒。
以上属性的设定视您的需要而定,我只是说在我的 VBBeepSVC 中如此设定足够了。
3 、编写代码,实现服务逻辑以及服务安装、撤除。
因为服务程序实际上是一个 Exe 文件,并且需要自己解决安装、撤除问题,因此需要在此程序中加入利用 NT 服务控件来实现安装、撤除问题。那么,应当在什么时候进行了。 VB 程序启动时正时 Form 装载的时候,所以,我们需要在窗体的 Load 事件中加入一些代码:
On Error GoTo Err_Load ‘ 如果出现错误就纪录以供参考
Dim strDisplayName As String
strDisplayName = NTService1.DisplayName
If Command = "-install" Then ‘ 当启动时带上 –install 的参数时
NTService1.Interactive = True
If NTService1.Install Then
Call NTService1.SaveSetting("Parameters", "TimerInterval", "1000") ‘ 系统参数存储
MsgBox strDisplayName & " 安装成功! "
Else
MsgBox strDisplayName & " 安装失败 "
End If
End ‘ 终止安装
Else
If Command = "-uninstall" Then ‘ 如果启动时带上 撤除参数
If NTService1.Uninstall Then
MsgBox strDisplayName & " 撤除成功 "
Else
MsgBox strDisplayName & " 撤除失败 "
End If
End ‘ 终止撤除
Else
End If
End If
‘ 假若不是安装或撤除操作,即为启动服务
Timer1.Interval = CInt(NTService1.GetSetting("Parameters", "TimerInterval", "2000"))
‘ 使用 Timer 控件来模拟服务的线程特性
NTService1.ControlsAccepted = svcCtrlPauseContinue ‘ 接受暂停、停止操作,意味着需要为此编码
NTService1.StartService ‘ 设置好参数后启动服务
Err_Load:
Call NTService1.LogEvent(svcMessageError, svcEventError, "[" & Err.Number & "] " & Err.Description) ‘svcMessageError 为 NT 服务控件的错误值
4 、添加控制服务的代码。
尽管服务的连续线程等特性是依赖 Timer 实现的,但是服务的控制却是有 SCM 接口向每一个服务发出的,表现在 VB 服务程序中为 NT 服务控件捕获到相关的事件发生,我们就应当在这些事件中根据具体的情况响应,决定能不能、如何控制服务逻辑。当然,具体的逻辑在 Timer 事件中表现,但是通过改变 NT 服务控件和 Timer 控件均支持的全局变量,可以实现控制服务的逻辑实现。具体代码演示:
Private Sub NTService1_Control(ByVal EventID As Long)
On Error GoTo Err_Control
‘ 在此加入一些自己的处理逻辑,当然也可以如本例一样空缺
Err_Control:
Call NTService1.LogEvent(svcMessageError, svcEventError, "[" & Err.Number & "] " & Err.Description) ‘ 纪录
End Sub
Private Sub NTService1_Pause(Success As Boolean)
On Error GoTo Err_Pause
Timer1.Enabled = False ‘ 禁止 Timer 事件,因此也停止了服务的发生
Call NTService1.LogEvent(svcEventError, svcMessageError, "Service paused")
Success = True ‘ 返回给 SCM 命令发出者 , 表示服务成功停止
Err_Pause:
Call NTService1.LogEvent(svcMessageError, svcEventError, "[" & Err.Number & "] " & Err.Description)
End Sub
Private Sub NTService1_Start(Success As Boolean)
On Error GoTo Err_Start
Success = True
Timer1.Enabled = True ‘ 允许服务逻辑进行
Err_Start:
Call NTService1.LogEvent(svcMessageError, svcEventError, "[" & Err.Number & "] " & Err.Description)
End Sub
Private Sub NTService1_Stop()
On Error GoTo Err_Stop
Unload Me ‘ 撤除 Form, 自然 Timer 也不存在,服务逻辑停止了

Err_Stop:
Call NTService1.LogEvent(svcMessageError, svcEventError, "[" & Err.Number & "] " & Err.Description)
End Sub
5 、编写服务逻辑。
具体就是在 Timer 事件中,根据约定写一些服务细节。本例中就是发出 Been ,但是考虑到对 SCM 命令的响应,所以需要编码为:
On Error GoTo Err_Timer
Beep ‘ 此处即具体的服务细节
Err_Timer:
Call NTService1.LogEvent(svcMessageError, svcEventError, "[" & Err.Number & "] " & Err.Description)
End Sub
6 、编译安装、测试
如果以上没有什么错误的话,现在可以编译程序了。假设我们得到的服务程序的文件名为: VBBeepSVC.exe, 我们需要通过以下命令进行安装:
d:/vbprog/>VBBeepSVC –install
如果需要撤除已经安装的服务,则:
d:/vbprog/>VBBeepSVC –uninstall
安装完后,打开控制面板的“服务”( win2000 中在“管理工具”) , 好了,看到其中的 NT 服务列表中包含我们加入的服务,显示为:“ The VB NT SVC View ”,我们可以类似启动其他任何服务一样启动、停止、暂停此服务。启动服务时,我们会听到服务发出的讨厌的 beep 声音。我们的测试完成。

四、 VB 编写服务的几个说明:
1 、首先声明: VB 编写服务是一种尝试,技术研究,并非提倡所有服务都要用 VB 写才对头。同理,也说明了服务非 VC 写不可。
2 、 VB 写的服务仅适合 win32 服务,不适合 NT 底层服务。
3 、 VB 的优势在 ActiveX 控件, NT 服务中我们可以使用绝大多数控件来完成我们的服务逻辑,譬如涉及数据库操作,我们可以使用 ADO 组件,这方面,同 VC 相比, VB 具有天然的优势。
4 、做好服务内部的错误事件记载,只有用好这一点,才能够真正符合服务编写规范,也方便我们的除错。
5 、最后一点,本文仅供参考,如有错误以及错误引起的后果,本人概不负责.

 
 

上一篇:VB中访问存储过程的几种办法  下一篇:用VB函数Dir实现递归搜索目录