例子源码挂在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,如果是网络路径 格式需为已 "\\" 拼接的路径.
lpDatabaseName //指定打开的数据库名字,如果为NULL,打开默认的default 服务数据库。
dwDesiredAccess //指定访问的方式
返回值:
当函数调用成功,返回已打开的(SC_HANDLE)句柄
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
左右:用于创建一个服务.
参数介绍:
hSCManager //OpenSCManager打开的句柄
lpServiceName //指定注册服务的名字
dwDesiredAccess //指定创建服务所支持的访问控制
dwServiceType //指定创建的服务的类型
dwStartType //指定服务启动的类型
dwErrorControl //指定发生错误时的错误处理方式
lpBinaryPathName // 指定程序的路径
lpLoadOrderGroup //指定服务所属组,为NULL则不为任何组
lpdwTagId //当没有所属组,此值为NULL
lpDependencies //如果没有依赖项,此值为NULL
lpServiceStartName //指定为NULL,以localSystem账户启动
lpPassword //当lpServiceStartName 不为NULL,需指定此参数。此参数指定lpServiceStartName的密码
返回值:
如果函数失败,返回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 );
枚举当前已注册的所有服务,函数可以一次获取所有服务的信息,所以接收体需要足够大
参数:
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 表示指向下一个服务节点的地址以获取更多附加数据。
返回值:
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 );
查询服务的详细信息
参数:
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 );
查询服务的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 );
函数: