posts - 7, comments - 5, trackbacks - 0, articles - 4

windows service程序步骤

Posted on 2008-07-04 23:17 阿呆 阅读(864) 评论(0)  编辑 收藏 引用

 一个windows服务程序大体可以三步来写,其大体框架如下:

 1// TestService.cpp : Defines the entry point for the console application.
 2//
 3
 4#include "stdafx.h"
 5#include <Windows.h>
 6
 7LPTSTR g_ServiceName = _T("TestService");
 8
 9void WINAPI ServiceCtrlHandler(DWORD code)
10{
11    //process control requests.
12    //比如,当收到SERVICE_CONTROL_STOP请求时,设置server状态为stop
13}

14
15void MyServiceTestFuncion()
16{
17    //service功能函数。在这里写我们要service做什么事情
18}

19
20//服务入口函数,一些初始化动作在此处进行
21void WINAPI ServiceMain()
22{
23    SERVICE_STATUS_HANDLE hStatus;
24    hStatus = RegisterServiceCtrlHandler(
25        g_ServiceName,    //服务名称
26        ServiceCtrlHandler);//处理服务控制请求的函数
27    if (!hStatus)
28    {
29        //注册失败
30    }

31    else
32    {
33        MyServiceTestFuncion();
34    }

35}

36
37//函数入口函数
38int _tmain(int argc, _TCHAR* argv[])
39{
40    SERVICE_TABLE_ENTRY ServiceTable[] = {
41        {g_ServiceName, (LPSERVICE_MAIN_FUNCTIONW)ServiceMain},
42        {NULL, NULL}
43    }
;
44
45    StartServiceCtrlDispatcher(ServiceTable);
46    return 0;
47}

48
49


以下介绍这3个步骤:
1、在main函数中调用StartServiceCtrlDispatcher函数,该函数会启动新线程来执行程序中所要执行的服务。

1    SERVICE_TABLE_ENTRY ServiceTable[] = {
2        {g_ServiceName, (LPSERVICE_MAIN_FUNCTIONW)ServiceMain},
3        {NULL, NULL}
4    }
;
5
6    StartServiceCtrlDispatcher(ServiceTable);

 

其中,SERVICE_TABLE_ENTRY是一个结构,其中包括两个域:

 LPTSTR lpServiceName;
  LPSERVICE_MAIN_FUNCTION lpServiceProc;


lpServiceName
指定在service进程中运行的服务的名字,它可以是空字符串("”),但不能是NULL

我们在程序的开始处指定如下:LPTSTR g_ServiceName = _T("TestService");

lpServiceProc指向服务入口函数的指针,即新启动的服务线程的指针。

一个服务程序可以启动几个线程,取决于ServiceTable中元素的个数。注意,ServiceTable的最后一个元素必须是{NULL, NULL},以表示结束。

StartServiceCtrlDispatcher函数(其后所用的windowsAPI也是)的头文件是Windows.h,因此要包含该头文件

2、定义服务的入口函数ServiceMain

ServiceMain函数中调用RegisterServiceCtrlHandler函数来注册一个函数处理服务控制请求。函数调用方式如下:

RegisterServiceCtrlHandler( 
 g_ServiceName,     
//服务名称 
 ServiceCtrlHandler);
//处理服务控制请求的函数

RegisterServiceCtrlHandler 函数返回一个SERVICE_STATUS_HANDLE类型的handle来表明service的状态,如果是0,则表示注册失败。

然后调用我们的服务最主要的函数实现我们所要实现的功能:

MyServiceTestFuncion();//实现该服务要实现的功能

3、实现ServiceCtrlHandler函数

ServiceCtrlHandler函数的定义如下:

VOID WINAPI ServiceCtrlHandler (

  DWORD fdwControl

);

其中,fdwControlControl Code,监控服务的状态,可以在其中针对服务的各种状态进行动作,比如,当fdwControlSERVICE_CONTROL_STOP时,停止该服务。

一个service程序实现的大致步骤如上。

 


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理