文档章节

SERVICE_STATUS结构各成员解析

Y
 Y13
发布于 2016/05/14 01:40
字数 840
阅读 5
收藏 0

在编写Windows服务的时候,需要调用API函数::SetServiceStatus()向服务控制管理器(SCM)提交更新当前服务的状态信息,其第2个参数为指向SERVICE_STATUS结构的指针,SERVICE_STATUS结构中包含了表示当前服务状态的信息,对其各成员一一分析:

typedef struct _SERVICE_STATUS {
  DWORD dwServiceType;
  DWORD dwCurrentState;
  DWORD dwControlsAccepted;
  DWORD dwWin32ExitCode;
  DWORD dwServiceSpecificExitCode;
  DWORD dwCheckPoint;
  DWORD dwWaitHint;
} SERVICE_STATUS, *LPSERVICE_STATUS;

dwServiceType:指明服务可执行文件的类型。如果可执行文件中只有一个单独的服务,就把这个成员设置成SERVICE_WIN32_OWN_PROCESS;如果拥有多个服务的话,就设置成SERVICE_WIN32_SHARE_PROCESS。除了这两个标志之外,如果你的服务需要和桌面发生交互(当然不推荐这样做),就要用“|”运算符附加上SERVICE_INTERACTIVE_PROCESS。这个成员的值在服务的生存期内绝对不应该改变。

dwCurrentState:用于通知SCM此服务的现行状态。为了报告服务仍在初始化,应该把这个成员设置成SERVICE_START_PENDING。

dwControlsAccepted:指明服务接受什么样的控制通知。如果允许一个服务控制程序(SCP)去暂停/继续服务,就把它设成SERVICE_ACCEPT_PAUSE_CONTINUE。很多服务不支持暂停或继续,就必须自己决定在服务中它是否可用。如果你允许一个SCP去停止服务,就要设置它为SERVICE_ACCEPT_STOP。如果服务要在操作系统关闭的时候得到通知,设置它为SERVICE_ACCEPT_SHUTDOWN可以收到预期的结果。这些标志可以用“|”运算符组合。

dwWin32ExitCode和dwServiceSpecificExitCode:是允许服务报告错误的关键,如果希望服务去报告一个Win32错误代码(预定义在WinError.h中),它就设置dwWin32ExitCode为需要的代码。一个服务也可以报告它本身特有的、没有映射到一个预定义的Win32错误代码中的错误。为了这一点,要把dwWin32ExitCode设置为ERROR_SERVICE_SPECIFIC_ERROR,然后还要设置成员dwServiceSpecificExitCode为服务特有的错误代码。当服务运行正常,没有错误可以报告的时候,就设置成员dwWin32ExitCode为NO_ERROR。

dwCheckPoint和dwWaitHint:是一个服务用来报告它当前的事件进展情况的。当成员dwCurrentState被设置成SERVICE_START_PENDING的时候,应该把dwCheckPoint设成0,dwWaitHint设成一个经过多次尝试后确定比较合适的超时毫秒数,这样服务才能高效运行。一旦服务被完全初始化,就应该重新初始化SERVICE_STATUS结构的成员,更改dwCurrentState为SERVICE_RUNNING,然后把dwCheckPoint和dwWaitHint都改为0。【MSDN:Estimated time required for a pending start, stop, pause, or continue operation, in milliseconds. Before the specified amount of time has elapsed, the service should make its next call to theSetServiceStatus function with either an incremented dwCheckPoint value or a change indwCurrentState. If the amount of time specified by dwWaitHint passes, and dwCheckPoint has not been incremented or dwCurrentState has not changed, the service control manager or service control program can assume that an error has occurred and the service should be stopped.】在dwWaitHint指定的超时时间到达之前,服务应该进行新的一次::SetServiceStatus()函数的调用,递增 dwCheckPoint或者改变dwCurrentState,如果dwWaitHint指定的超时时间已经过去(已经超时),既没有递增dwCheckPoint,又没有改变dwCurrentState,则服务控制管理器(SCM)或者服务控制程序(SCP)将假设一个错误已经发生,且服务应该停止。

© 著作权归作者所有

共有 人打赏支持
Y

Y13

粉丝 0
博文 30
码字总数 148304
作品 0
大连
高级程序员
私信 提问
SERVICE_STATUS结构各成员解析

在编写Windows服务的时候,需要调用API函数::SetServiceStatus()向服务控制管理器(SCM)提交更新当前服务的状态信息,其第2个参数为指向SERVICESTATUS结构的指针,SERVICESTATUS结构中包含了...

geek_loser
2016/03/04
18
0
ASIHTTPRequest 和 libxml 结合,实现边请求边解析

ASIHTTPRequests 是非常强大的 http 异步请求开源框架,libxml 是非常老牌的 C 语言xml函数库。在 http + xml 文件的 javaEE-iPhone 应用中,如何把二者结合起来,实现在异步请求数据的同时...

鉴客
2012/01/09
955
0
Audroid中audio子系统分析(1) --- 服务调用架构

以audiosystem中的static status_t setStreamMute(int stream, bool mute);函数的调用为例。 AudioSystem.cpp中相应代码如下: status_t AudioSystem::setStreamMute(int stream, bool mute)......

ChenQi
2012/02/24
0
0
复制状态与变量记录表 | performance_schema全方位介绍(六)

罗小波·沃趣科技高级数据库技术专家 出品 沃趣科技 IT从业多年,历任运维工程师,高级运维工程师,运维经理,数据库工程师,曾参与版本发布系统,轻量级监控系统,运维管理平台,数据库管理...

老叶茶馆_
2018/09/12
0
0
oracle 体系结构及内存管理 02_监听及网络配置

1、Oracle监听 监听具有独立性:与数据库的启动顺序无关先后,监听知道数据库的位置与端口,与数据库没有常连接。 连接建立流程:客户端连接监听,监听将客户端连接转发给数据库实例,数据库...

PeakFang-BOK
2018/10/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如何在 Linux 系统查询机器最近重启时间

在你的 Linux 或类 UNIX 系统中,你是如何查询系统上次重新启动的日期和时间?怎样显示系统关机的日期和时间? last 命令不仅可以按照时间从近到远的顺序列出该会话的特定用户、终端和主机名...

来来来来来
38分钟前
0
0
Redis协议是什么样的

前言 我们用过很多redis的客户端,有没有相过自己撸一个redis客户端? 其实很简单,基于socket,监听6379端口,解析数据就可以了。 redis协议 解析数据的过程主要依赖于redis的协议了。 我们...

春哥大魔王的博客
55分钟前
2
0
乱入Linux界的我是如何学习的

欢迎来到建哥学Linux,咳!咳!咳!开个玩笑哈,我是一个IT男,IT界的入门选手,正在学习Linux。 在之前,一直想进军IT界,学习IT技术,但是苦于没有人指导,也不知道学什么,最开始我自己在...

linuxCool
今天
1
0
携程Apollo统一配置中心的搭建和使用(java)

一.Apollo配置中心介绍 1、What is Apollo 1.1 Apollo简介 Apollo(阿波罗)是携程框架部门研发的开源配置管理中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到...

morpheusWB
今天
1
0
远程获得的有趣的linux命令

使用这些工具从远程了解天气、阅读资料等。 我们即将结束为期 24 天的 Linux 命令行玩具日历。希望你有一直在看,如果没有,请回到开始,从头看过来。你会发现 Linux 终端有很多游戏、消遣和...

Linux就该这么学
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部