C++ (Windows Service)服务编程教程
例子源码挂在github上,如有需要请clone : https://github.com/mox9378/Cpp-Simple-Windows-Service-Example
欢迎 C++/Python 的朋友一起交流学习, My QQ Number: 2303186535
以下附上相关结构体和函数的介绍:
Struct
SERVICE\_STATUS结构定义了服务的运行状态/服务类型/接受的控制形式以及指定错误代码等
1 typedef struct _SERVICE_STATUS {
2 DWORD dwServiceType; //服务类型
3 DWORD dwCurrentState; //当前服务运行状态
4 DWORD dwControlsAccepted; //接受控制的类型,注册服务时。此参数默认设置0
5 DWORD dwWin32ExitCode; //指定当服务【开始】/【停止】的退出码,默认0
6 DWORD dwServiceSpecificExitCode; 默认为0,指定当服务运行或停止错误时的代码,参数会忽略dwWin2ExitCode,除非dwWin2ExitCode指定为ERROR_SERVICE_SPECIFIC_ERROR,
7 DWORD dwCheckPoint; //默认设置0
8 DWORD dwWaitHint; //默认设置0
9 } SERVICE_STATUS, *LPSERVICE_STATUS;
1 typedef struct _QUERY_SERVICE_CONFIG {
2 DWORD dwServiceType;
3 DWORD dwStartType;
4 DWORD dwErrorControl;
5 LPTSTR lpBinaryPathName;
6 LPTSTR lpLoadOrderGroup;
7 DWORD dwTagId;
8 LPTSTR lpDependencies;
9 LPTSTR lpServiceStartName;
10 LPTSTR lpDisplayName;
11 } QUERY_SERVICE_CONFIG, *LPQUERY_SERVICE_CONFIG;
QUERY_SERVICE_CONFIG 和 SERVICE_STATUS 的结构参数类似。
1 typedef struct _ENUM_SERVICE_STATUS {
2 LPTSTR lpServiceName;
3 LPTSTR lpDisplayName;
4 SERVICE_STATUS ServiceStatus;
5 } ENUM_SERVICE_STATUS, *LPENUM_SERVICE_STATUS;
ENUM_SERVICE_STATUS 包含服务的名字,显示名。
1 SC_HANDLE OpenSCManager(
2 LPCTSTR lpMachineName, // computer name
3 LPCTSTR lpDatabaseName, // SCM database name
4 DWORD dwDesiredAccess // access type
5 );
函数:OpenSCManager
打开服务器控制管理器
参数:
lpMachineName //指定计算机的名字,如果为NULL,默认为local,如果是网络路径 格式需为已 "\\" 拼接的路径.<br></br><em>lpDatabaseName </em>//指定打开的数据库名字,如果为NULL,打开默认的default 服务数据库。<br></br><em>dwDesiredAccess //指定访问的方式</em><br></br><br></br>返回值:<br></br>当函数调用成功,返回已打开的(SC_HANDLE)句柄<br></br><br></br>
1 SC_HANDLE CreateService(
2 SC_HANDLE hSCManager, // handle to SCM database
3 LPCTSTR lpServiceName, // name of service to start
4 LPCTSTR lpDisplayName, // display name
5 DWORD dwDesiredAccess, // type of access to service
6 DWORD dwServiceType, // type of service
7 DWORD dwStartType, // when to start service
8 DWORD dwErrorControl, // severity of service failure
9 LPCTSTR lpBinaryPathName, // name of binary file
10 LPCTSTR lpLoadOrderGroup, // name of load ordering group
11 LPDWORD lpdwTagId, // tag identifier
12 LPCTSTR lpDependencies, // array of dependency names
13 LPCTSTR lpServiceStartName, // account name
14 LPCTSTR lpPassword // account password
15 );
函数:CreateService<br></br> 左右:用于创建一个服务.
参数介绍:
hSCManager //OpenSCManager打开的句柄
lpServiceName //指定注册服务的名字
lpDisplayName //指定注册服务显示的名字
*dwDesiredAccess //指定创建服务所支持的访问控制*
*dwServiceType //指定创建的服务的类型*
*dwStartType //指定服务启动的类型*
*dwErrorControl //指定发生错误时的错误处理方式*
*lpBinaryPathName // 指定程序的路径*
*lpLoadOrderGroup //指定服务所属组,为NULL则不为任何组*
*lpdwTagId //当没有所属组,此值为NULL*
*lpDependencies //如果没有依赖项,此值为NULL*
*lpServiceStartName //指定为NULL,以localSystem账户启动*
lpPassword //当lpServiceStartName 不为NULL,需指定此参数。此参数指定lpServiceStartName的密码
返回值:
如果函数成功,返回一个SC\_HANDLE的实例句柄。
如果函数失败,返回NULL, 调用GetLastError 获取错误代码。
1 BOOL EnumServicesStatus(
2 SC_HANDLE hSCManager, // handle to SCM database
3 DWORD dwServiceType, // service type
4 DWORD dwServiceState, // service state
5 LPENUM_SERVICE_STATUS lpServices, // status buffer
6 DWORD cbBufSize, // size of status buffer
7 LPDWORD pcbBytesNeeded, // buffer size needed
8 LPDWORD lpServicesReturned, // number of entries returned
9 LPDWORD lpResumeHandle // next entry
10 );
函数:EnumServicesStatus
枚举当前已注册的所有服务,函数可以一次获取所有服务的信息,所以接收体需要足够大
参数:
*hSCManager //打开的句柄*
*dwServiceType //要枚举的服务类型 【SERVICE\_WIN32 / SERVICE\_DRIVER】*
*dwServiceState // 要枚举的状态*
*lpServices // out: ENUM\_SERVICE\_STATUS 结构的输出参数,a struct = a service info。*
cbBufSize //指定 lpServices 的大小,以字节为单位**
*pcbBytesNeeded // out: 接收实际需要的大小*
*lpServicesReturned //out: 接收服务的数量*
*lpResumeHandle // 函数初次调用此参数必须为0,当函数调用成功。此参数为0. 当函数返回为0,GetLastError == ERROR\_MORE\_DATA 表示指向下一个服务节点的地址以获取更多附加数据。*
返回值:
函数调用成功返回 nonzero.
函数调用失败返回zero
1 SC_HANDLE OpenService(
2 SC_HANDLE hSCManager, // handle to SCM database
3 LPCTSTR lpServiceName, // service name
4 DWORD dwDesiredAccess // access
5 );
函数:OpenService
打开指定的服务
参数:
hSCManager //句柄
lpServiceName //要打开的服务名
dwDesiredAccess //打开的方式
返回值:
调用成功返回打开的服务的句柄,
调用失败返回NULL。
1 BOOL QueryServiceConfig(
2 SC_HANDLE hService, // handle to service
3 LPQUERY_SERVICE_CONFIG lpServiceConfig, // buffer
4 DWORD cbBufSize, // size of buffer
5 LPDWORD pcbBytesNeeded // bytes needed
6 );
函数: QueryServiceConfig
查询服务的详细信息
参数:
hService //打开服务的句柄
lpServiceConfig // out: 接收服务信息的结构 【QUERY\_SERVICE\_CONFIG】
cbBufSize // 指定 lpServiceConfig的大小,以字节为单位
pcbBytesNeeded // out: 实际接收的字节数
返回值:
调用成功返回nonzero,
调用失败返回zero.
1 BOOL QueryServiceConfig2(
2 SC_HANDLE hService, // handle to service
3 DWORD dwInfoLevel, // information level
4 LPBYTE lpBuffer, // buffer
5 DWORD cbBufSize, // size of buffer
6 LPDWORD pcbBytesNeeded // bytes needed
7 );
函数: QueryServiceConfig2
查询服务的information,具体为描述信息,可以参考 QueryServiceConfig。
1 BOOL QueryServiceStatus(
2 SC_HANDLE hService, // handle to service
3 LPSERVICE_STATUS lpServiceStatus // service status
4 );
函数: QueryServiceStatus
查询服务的运行状态
参数:
hService //句柄
lpServiceStatus // out: 一个SERVICE\_STATUS 结构的指针,接收服务状态
返回值:
调用成功返回nonzero,
调用失败返回zero.
1 BOOL ControlService(
2 SC_HANDLE hService, // handle to service
3 DWORD dwControl, // control code
4 LPSERVICE_STATUS lpServiceStatus // status information
5 );
函数:ControlService
控制服务的运行
参数:
hService // 打开实例的句柄
dwControl //控制的标志
lpServiceStatus // out 一个service\_status结构,接收服务的详细信息
返回值:
调用成功返回nonzero,
调用失败返回zero.
1 BOOL StartService(
2 SC_HANDLE hService, // handle to service
3 DWORD dwNumServiceArgs, // number of arguments
4 LPCTSTR *lpServiceArgVectors // array of arguments
5 );
函数:
启动一个已注册的服务
参数:
hService // 一个打开或创建的句柄
dwNumServiceArgs //服务参数,可为0
lpServiceArgVectors //如果没有参数传递,可以为NULL
返回值:
调用成功返回nonzero,
调用失败返回zero.
1 BOOL CloseServiceHandle( 2 SC\_HANDLE hSCObject // handle to service or SCM object 3 );
函数:
关闭一个打开的服务句柄