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

被折叠的 条评论
为什么被折叠?



