这是很久以前写的代码,近期有朋友在问,就顺便发出来服务程序运行于后台,没有界面,随系统启动,用VFP编写服务程序其实也很简单,下面是编写服务程序过程可能会用到的:
1.启动,停止一个已注册的服务程序 ServiceRun()
*下面代码演示了停止并启动SQL服务
#define SERVICE_CONTROL_START 0x00000000
#define SERVICE_CONTROL_STOP 0x00000001
#define SERVICE_CONTROL_PAUSE 0x00000002
#define SERVICE_CONTROL_CONTINUE 0x00000003
Set Library To myfll
?"正在停止你的SQL服务", ServiceRun("MSSQLSERVER",SERVICE_CONTROL_STOP)
?"当前状态",ServiceStatus("MSSQLSERVER")
Messagebox("看下SQL状态?")
?"正在启动你的SQL服务", ServiceRun("MSSQLSERVER",SERVICE_CONTROL_START)
Set Library To
Return
2.创建(注册),删除一个服务ServiceCreate() ServiceDelete(),查询服务程序的状态ServiceStatus()
#define SERVICE_AUTO_START 0x00000002
#define SERVICE_DEMAND_START 0x00000003
#define SERVICE_DISABLED 0x00000004
Set Library To myfll
cSvr="MFLService"
If not ServiceCreate(cSvr,"d:\程序\aa.exe","MyFLL Service","MyFLL服务程序示例",SERVICE_AUTO_START)
?"服务创建失败"
EndIf
*aa.exe来自于ServiceHOOK()示例
?"查询服务状态:",ServiceStatus(cSvr)
?"开始启动服务:",ServiceRun(cSvr,0)
?"查询服务状态:",ServiceStatus(cSvr)
*?"删除服务",ServiceDelete(cSvr)
Set Library To
Return
3.如何在VFP中编写服务程序
服务程序跟普通程序的区别在于需要跟服务管理管制台交互,VFP无法直接跟控制台交互,MYFLL中提供了一个用于交互的函数 ServiceHook(),在VFP里只用绑定消息,在消息绑定的函数中用ServiceTel()回应自身的状态即可。
*下面代码是一个服务程序示例
*先把下面代码保存成 ServiceMain.prg,然后在D:\程序\下建立一个aa.pjx项目,加入这个PRG编译成aa.exe即可
*然后参阅ServiceCreate()函数创建服务,参阅ServiceRun()启动、停止、暂停、恢复它
*下面示例中TO DO的地方,务必要加入自己的代码
#define SERVICE_MESSAGE 0x9001
Set Default To Justpath(_vfp.ServerName )
Set Library To myfll
_vfp.AutoYield= .f.
On Shutdown quit
oHook=Newobject("ServiceMessage")
Bindevent(_vfp.hWnd,SERVICE_MESSAGE, oHook,"OnServiceMessage")
dwThreadID = ServiceHook("MFLService",_vfp.hWnd ,SERVICE_MESSAGE)
Read EVENTS
Quit
*-------------------------------------------------------------------------------
*类 名:ServiceHook
*作 者:木瓜
*更新日期:2010-10-8
*备 注:接收服务器消息
*-------------------------------------------------------------------------------
Define Class ServiceMessage as Session
*---- OnServiceMessage() ---- 接收消息
Procedure OnServiceMessage
Lparameters hWnd,; &&句柄
dwMSG,; &&绑定的消息值
dwMSGType,; &&事件类型 0-普通事件, 1-Windows服务控制器事件
dwControl &&消息
Local cMsg
cMsg = Ttoc(Datetime())+" OnServiceMessage "
* 0-普通事件
* 普通事件只需要简单处理
If dwMsgType==0
cMsg = cMsg + " 普通事件 "
DO CASE
CASE dwControl=1
this.LogMessage(cMsg+"1 开始启动服务")
CASE dwControl=2
this.LogMessage(cMsg+"2 启动服务失败")
*这时要退出程序
Clear Events
CASE dwControl=3
this.LogMessage(cMsg+"3 开始注册")
CASE dwControl=4
this.LogMessage(cMsg+"4 注册失败")
*这时要退出程序
Clear Events
CASE dwControl=5
this.LogMessage(cMsg+"5 注册成功,服务运行中")
OTHERWISE
this.LogMessage(cMsg+"未知的事件:"+Transform(dwMSGType)+"-"+Transform(dwControl))
EndCase
*普通事件可以直接返回
Return
EndIf
* 1-Windows服务事件,包括停止、暂停、继续
* Windows服务事件需要响应服务器
If dwMsgType==1
cMsg = cMsg + " 服务事件 "
*windows定义的事件值
#define SERVICE_CONTROL_STOP 0x00000001
#define SERVICE_CONTROL_PAUSE 0x00000002
#define SERVICE_CONTROL_CONTINUE 0x00000003
#define SERVICE_STOPPED 0x00000001
#define SERVICE_RUNNING 0x00000004
#define SERVICE_PAUSED 0x00000007
Do case
Case dwControl==SERVICE_CONTROL_STOP
*接收到停止指令,在这里执行服务被停止时的操作,然后退出程序
this.LogMessage(cMsg+"1 接收到停止指令")
*◆◆TO DO
*执行完你的代码后,一定要通知服务管理器你已停止成功
ServiceTell(SERVICE_STOPPED)
*通知完服务器,自己就可以退出了
Clear Events
Quit
Case dwControl==SERVICE_CONTROL_PAUSE
*接收到暂停指令
this.LogMessage(cMsg+"2 接收到暂停指令")
*◆◆TO DO
*执行完你的代码后,一定要通知服务管理器你已暂停
ServiceTell(SERVICE_PAUSED)
Case dwControl==SERVICE_CONTROL_CONTINUE
*接收到继续指令
this.LogMessage(cMsg+"3 接收到继续指令")
*◆◆TO DO
*执行完你的代码后,一定要通知服务管理器你已继续运行
ServiceTell(SERVICE_RUNNING)
EndCase
EndIf
EndProc
*记录日志
Procedure LogMessage(cMsg)
Strtofile(Chr(13)+Chr(10)+cMsg,"ServiceLog.txt",1)
EndProc
EndDefine