一个windows服务程序大体可以三步来写,其大体框架如下:
//
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
函数,该函数会启动新线程来执行程序中所要执行的服务。
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
);
其中, fdwControl 是 Control Code ,监控服务的状态,可以在其中针对服务的各种状态进行动作,比如,当 fdwControl 是 SERVICE_CONTROL_STOP 时,停止该服务。
一个 service 程序实现的大致步骤如上。
本文介绍了Windows服务程序的基本编写步骤,包括在main函数中调用StartServiceCtrlDispatcher启动服务线程,定义ServiceMain作为服务入口函数并注册服务控制处理函数,以及实现ServiceCtrlHandler函数处理服务控制请求。
2988

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



