本博文由CSDN博主zuishikonghuan所作,版权归zuishikonghuan所有,转载请注明出处:http://blog.csdn.net/zuishikonghuan/article/details/47604179
一。服务程序基本概念
在Windows中,有一个特殊的群体,他们天生拥有极高的权限,在一些特殊用户,比如“SYSTEM”的用户中工作。他们享受很高的优待。很多系统功能(更新服务,触摸屏服务。。。)都是以服务运行的。应用程序也可以安装控制自己的服务(使用服务管理器API,以后会讲)。下面,让我们看看如何编写一个Win32服务。
图:系统中安装的服务
二。服务程序的编写框架
1。StartServiceCtrlDispatcher函数
BOOL WINAPI StartServiceCtrlDispatcher(
_In_ const SERVICE_TABLE_ENTRY *lpServiceTable
);
函数功能:连接到服务控制管理器
参数:一个SERVICE_TABLE_ENTRY结构的指针,成员表中的最后一项必须具有NULL值,来指定表的末尾。
2。SERVICE_TABLE_ENTRY结构:
typedef struct _SERVICE_TABLE_ENTRY {
LPTSTR lpServiceName;
LPSERVICE_MAIN_FUNCTION lpServiceProc;
} SERVICE_TABLE_ENTRY, *LPSERVICE_TABLE_ENTRY;
lpServiceName:要在此服务进程中运行的服务名称,不能和其他程序的重了。我一般把这个名称设为注册到系统的服务名称一致。
如果服务安装的是SERVICE_WIN32_OWN_PROCESS服务类型,此成员将被忽略,但不能为 NULL,可以是空字符串("")。
lpServiceProc:指针,指向ServiceMain函数。
3。ServiceMain函数:(服务启动回调函数)
VOID WINAPI ServiceMain(
_In_ DWORD dwArgc,
_In_ LPTSTR *lpszArgv
);
dwArgc:lpszArgv数组中字符串个数
lpszArgv:启动参数
当服务控制管理器收到请求启动服务时,便会启动服务进程(如果尚未运行)。服务进程的主线程调用StartServiceCtrlDispatcher函数用到的SERVICE_TABLE_ENTRY结构数组的指针。然后服务控制管理器将启动请求发送到服务控制调度程序为此