Windows服务进程的创建

本文介绍如何创建Windows服务程序,包括启动服务控制分派机、实现服务入口函数ServiceMain及ControlHandler函数等内容。

                                       Windows服务进程的创建

       windows服务程序一般是在后台跑的不需要用户交互的程序。

 

       创建windows服务程序的步骤:

       1. 在main中启动 服务控制分派机

            调用StartServiceCtrlDispatcher,它的参数是一个SERVICE_TABLE_ENTRY 数组,数组元素包含了要启动的服务名称,和服务主入口函数。

 

           

 

            这个数组的最后一个元素的值必须设置为NULL,这样才能够识别数组的结尾。所以上面的代码虽然只指定了一个服务,但是有两个元素。

           

            服务控制管理器(SCM:Services Control Manager)是一个管理系统所有服务的进程。当 SCM 启动某个服务时,它等待某个进程的主线程来调用 StartServiceCtrlDispatcher 函数。将分派表传递给 StartServiceCtrlDispatcher。这将把调用进程的主线程转换为控制分派器。这里就是mian函数这个主线程。该分派器启动一个新线程,该线程运行分派表中每个服务的 ServiceMain 函数(本文例子中只有一个服务)分派器还监视程序中所有服务的执行情况。然后分派器将控制请求从 SCM 传给服务。

 

 

         2.服务入口函数 ServiceMain的实现

         这是由控制分派器创建的一个线程。 在这个线程的开始,就需要去注册服务控制处理器。   调用的函数是: RegisterServiceCtrlHandler。 它指示控制分派器调用 ControlHandler 函数处理 SCM 控制请求。注册完控制处理器之后,获得状态句柄(hStatus)。通过调用 SetServiceStatus 函数,用 hStatus 向 SCM 报告服务的状态。

 

           在报告了服务状态之后,你可以调用 InitService 函数来完成初始化。

           这个函数随便你做什么都可以。

 

            在 ServiceMain 中,检查 InitService 函数的返回值。如果初始化有错(因为有可能写日志文件失败),则将服务状态置为终止并退出 ServiceMain:

 error = InitService();
if (error)
{
    // 初始化失败,终止服务
    ServiceStatus.dwCurrentState = SERVICE_STOPPED;
    ServiceStatus.dwWin32ExitCode = -1;
    SetServiceStatus(hStatus, &ServiceStatus);
    // 退出 ServiceMain
    return;
}

 

       

          

        

 

          

           

         

如果初始化成功,则向 SCM 报告状态:

// 向 SCM 报告运行状态 
ServiceStatus.dwCurrentState = SERVICE_RUNNING; 
SetServiceStatus (hStatus, &ServiceStatus);
 
   3. ControlHandler函数的实现

这个函数是用来响应SCM的命令的,它检查 SCM 发送了什么请求并采取相应行动。

STOP 请求是 SCM 终止服务的时候发送的。例如,如果用户在“服务”控制面板中手动终止服务。SHUTDOWN 请求是关闭机器时,由 SCM 发送给所有运行中服务的请求。两种情况的处理方式相同。控制处理器函数必须报告服务状态,即便 SCM 每次发送控制请求的时候状态保持相同。因此,不管响应什么请求,都要调用 SetServiceStatus。

 

 

 

服务的初始化函数InitService

本文的完成参照了以下地址的文章:
http://www.vckbase.com/document/viewdoc/?id=1474
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值