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 );

函数:

关闭一个打开的服务句柄

原文地址:https://www.cnblogs.com/emjx/p/11249576.html

时间: 2024-08-08 23:04:29

C++ (Windows Service)服务编程的相关文章

C# Windows Service服务的创建和调试

前言 关于Windows服务创建和调试的文章在网络上的很多文章里面都有,直接拿过来贴在这里也不过仅仅是个记录,不会让人加深印象.所以本着能够更深刻了解服务项目的创建和调试过程及方法的目的,有了这篇记录. 目录 一.什么是Windows Service服务? 二.基于C#的Windows Service服务的创建.安装.卸载? 三.Windows Service服务开发过程中如何调试代码? 正文 一.什么是Windows Service服务? Microsoft Windows 服务(即,以前的

C#制作Windows service服务系列二:演示一个定期执行的windows服务及调试(windows service)

系列一: 制作一个可安装.可启动.可停止.可卸载的Windows service(downmoon原创) 系列二:演示一个定期执行的windows服务及调试(windows service)(downmoon) 系列三: windows service系列三--制作可控制界面的windows service 一.经常有人问起如何让程序定期自动执行? 除了像系统任务和SQL JOB/DTS等都可以满足不同的用户需求外,这里演示了如何做一个简单的windows serivce的框架.主要的功能是按照

.Net Windows Service(服务) 调试安装及System.Timers.Timer 使用

Windows Service(服务)  是运行在后台的进程 1.VS建立 Windows 服务(.NET Framework) 2.添加Timer 双击Service1.cs可以拖控件(System.Windows.Forms.Timer)这儿注意命名空间哦, 双击 trmer1 生成事件,修改事件方法如下: App.config: <appSettings> <add key="TimerExecTime" value="0001-01-01 10:07

Visual Studio 2012的Windows Service服务安装方式

windows服务应用程序是一种长期运行在操作系统后台的程序,它对于服务器环境特别适合,它没有用户界面,不会产生任何可视输出,任何用户输出都回被写进windows事件日志.计算机启动时,服务会自动开始运行,他们不要用户一定登陆才运行. 可以通过选择菜单"开始"-〉"控制面板"-〉"系统和安全"-〉"管理工具" -〉"服务"来查看现有系统中的服务,如下图: 创建window 服务 新建一个window 服务项

[开发笔记]-Windows Service服务相关注意事项

注意一:报错:"本地计算机上的 *** 服务启动后停止.某些服务在未由其他服务或程序使用时将自动停止." 该问题主要的原因是 Service服务程序中有错误. 遇到这个问题时,无论是重新安装服务,还是重启计算机,每次启动时都会弹出这个错误提示框. 解决这种问题最好的办法就是:使用 控制台应用程序 来调试,等调试通过后,在加入到Service服务程序中. 注意二: 报错 :试图加载格式不正确的程序. 原因:程序集之间的通讯要么全是64位环境下的,要么全是32位环境下的.不能混编访问.不然

.Net Remoting的双向通信和Windows Service的宿主服务

原文:.Net Remoting的双向通信和Windows Service的宿主服务 作为微软分布式技术之一的.Net Remoting,从性能.安全等各方面来说都是相对比较稳定的,也是一项比较成熟的分布式技术. 从学习.Net Remoting至今,仅仅只使用了一次这门技术,是在去年的一个IM产品中.最近公司的产品出现了很多问题,服务器.通信接口.网站都陆续被攻击(DDOS).这对于做互联网产业的同行来说就清楚这里面的关系,强大的DDOS攻击可以直接让产品无法正常运营甚至停止运营. 经过一系列

如何注册Tomcat到Window Service服务

对于Web项目来说,经常用的服务器就是Tomcat.但是麻烦的事是,每次都得启动一下Tomcat服务.但是,如果把Tomcat的服务注册为Windows Service服务,就可以设置为开机自动启动,这样就不用每次手动启动了. 1.软件和环境 环境:JDK1.8 应用服务:Tomcat7.0(非安装版) 操作系统:Windows8 2.设置Tomcat为系统服务 win+R打开运行窗口,输入cmd打开dos窗口,使用cd命令将位置切换到tomcat路径下的bin文件,本机是F盘下. 先输入F:回

C# windows service

领导来了封邮件:C# 创建  windows service ,扫描相应目录,并将扫描到文件使用DOS 命令方式调用第三方Ftp工具上传到Ftp服务器. 短短几句话,看了好几遍.分析之后,由于对这个之前没有接触,一步一步来.这里也写一篇,一来跟新人分享下,二来希望前辈拍砖指点. 1.创建windows Service 服务. (这里参考http://blog.csdn.net/yysyangyangyangshan/article/details/10515035 前辈的博文,不过前辈的博文有两

windows无法启动VMware Authorization Service服务

VMware也用了一年了,一直好好的,今天突然出现启动不了VMware里的linux系统了, Authorization  Service问题,在windows系统里查看服务,找到VMware Authorization Service,点启动,弹出无法启动VMware Authorization  Service  1075服务不存在. 上网找到答案:这是装了VMware虚拟机软件之后,又用了系统优化工作之后造成的 万恶的金山毒霸,果断卸载了 windows无法启动VMware Authori