C++ (Windows Service)服务编程

Posted emjx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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,如果是网络路径 格式需为已 "\\" 拼接的路径.
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  //指定注册服务的名字

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)服务编程的主要内容,如果未能解决你的问题,请参考以下文章

windows service编程

c++ windows中客户端服务器编程中的多线程

启动没有高程的Windows服务

C++的socket编程学习

WIndows编程之线程池的使用

c++下基于windows socket的单线程服务器客户端程序