更多名人名博

上市公司专栏

实时股价每分更新

纳斯达克(美元)(市值:亿美元)
综指: 涨跌幅:
公司 股价 涨幅度 市值
盛大
网易
九城
畅游
完美
巨人
新浪
百度
恒生指数(港币)(市值:亿港币)
综指: 涨跌幅:
公司 股价 涨幅度 市值
腾讯
金山
网龙
创业板
综指: 涨跌幅:
公司 股价 涨幅度 市值
宝网
d
您现在的位置:首页> 开发|游戏程序|专业工具| > windows service程序步骤

windows service程序步骤

来源:IIEEG04-14-2011

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


 1  //  TestService.cpp : Defines the entry point for the console application.
 2  //
 3 
 4  #include  " stdafx.h "
 5  #include  < Windows.h >
 6 
 7  LPTSTR g_ServiceName  =  _T( " TestService " );
 8 
 9  void  WINAPI ServiceCtrlHandler(DWORD code)
10    {
11       // process control requests.
12       // 比如,当收到SERVICE_CONTROL_STOP请求时,设置server状态为stop
13  }
14 
15  void  MyServiceTestFuncion()
16    {
17       // service功能函数。在这里写我们要service做什么事情
18  }
19 
20  // 服务入口函数,一些初始化动作在此处进行
21  void  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  // 函数入口函数
38  int  _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      } ;

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

);

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

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