例子源码挂在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 );

函数:

关闭一个打开的服务句柄

标签: C++, Windows, 服务, service, HANDLE, DWORD, Service, SERVICE, STATUS

相关文章推荐

添加新评论,含*的栏目为必填