在VFP中控制和创建windows 服务程序

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">这是很久以前写的代码,近期有朋友在问,就顺序发出来</span>

服务程序运行于后台,没有界面,随系统启动,用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


下载完整测试项目


http://download.csdn.net/detail/ljyit/9115565



相关内容推荐