文档章节

SERVICE_STATUS结构各成员解析

Y
 Y13
发布于 2016/05/14 01:40
字数 840
阅读 4
收藏 0
点赞 2
评论 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 ⋅ 0

ASIHTTPRequest 和 libxml 结合,实现边请求边解析

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

鉴客 ⋅ 2012/01/09 ⋅ 0

vc++搭建一个NT服务框架

#include <stdio.h> #include <windows.h> SERVICESTATUS mServiceStatus; SERVICESTATUSHANDLE m_ServiceStatusHandle; BOOL bRunning=true; void WINAPI ServiceMain(DWORD argc, LPTSTR *......

junwong ⋅ 2012/03/09 ⋅ 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

类似xml的结构化二进制流协议--BStruct

BStruct,实现了二进制结构通信协议的构造与解析,可以想数组一样使用["数据名"]方便的读写数据,且像xml一样,数据之间没有顺序依赖。 协议介绍二进制结构通信协议将结构以二进制方式保存到...

火羽 ⋅ 2012/12/14 ⋅ 0

MySQL数据管理6

配置主从同步的步骤 环境准备 从一定要有主库比自己多个的数据 systemctl stop firewalld setenforce 0 物理连接能通 配置主数据库服务器 1 用户授权 grant replication slave on . to plj@...

hj_1314wgn ⋅ 2017/12/24 ⋅ 0

负载均衡通讯转发分发器(G5)源代码分析

负载均衡通讯转发分发器(G5)源代码分析 (以版本v1.1.0为准) G5源代码文件只有.c(2400行)和.h(260行)两个源文件,行数虽然不多,但是技术密集度较高,分析源码主要从基于epoll(ET)事件处理...

calvinwilliams ⋅ 2014/04/13 ⋅ 0

android设计模式-装饰模式(Decorator Pattern)

什么是装饰模式 装饰模式:动态地给一个对象添加一些额外的职责,本质就是拓展,不改变原有的代码结构。 类图 装饰模式的解析 如上图,首先Component提供一个接口让别人去实现,在装饰模式下...

cjh94520 ⋅ 2017/04/30 ⋅ 0

《深入理解Android:Wi-Fi,NFC和GPS》章节连载[节选]--第二章 深入理解Netd

首先感谢各位兄弟姐妹们的耐心等待。本书预计在3月中旬上市发售。从今天开始,我将在博客中连载此书的一些内容。注意,此处连载的是未经出版社编辑的原始稿件,所以样子会有些非专业。 注意,...

邓凡平 ⋅ 2014/03/03 ⋅ 0

Android 混淆解析

2018年第一篇,新年快乐! 一、混淆的目的 一款发布到市场的软件原则上都应该做代码混淆,可能有人会说谁有功夫破解你的烂代码,这个嘛,开心就好...... 通过代码混淆可以将项目中的类、方法...

Othershe ⋅ 01/02 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

对于程序员的招聘问题,作为软件人的一些吐槽和建议

作为软件人,找工作有时候似乎挺苦逼的。 说真的,让我去掉前面这句中“似乎”二字吧。就是苦逼!很多人都曾抱怨处在招聘的一方很糟糕——我们没有任何可靠的方式来甄别会写代码并且写得好的...

老道士 ⋅ 22分钟前 ⋅ 0

HDFS原理学习

一、概述 1、 Hadoop整合了众多的文件系统,首先提供了一个高层的文件系统抽象org.apache.hadoop.fs.FileSystem。然后有各个文件系统的实现类。 2、Hadoop是JAVA编写的,不同文件系统之间的交...

cjxcloud ⋅ 26分钟前 ⋅ 0

Linux下MySQL表名不区分大小写的设置方法(抄袭别人的)

Linux下MySQL表名不区分大小写的设置方法 MySQL表名不区分大小写的设置方法 在用centox安装mysql后,把项目的数据库移植了过去,发现一些表的数据查不到,排查了一下问题,最后发现是表名的大...

随风而浮沉 ⋅ 31分钟前 ⋅ 0

ubuntu下安装宋体simsun

sudo cp simsun.ttc /usr/share/fonts cd /usr/share/fonts sudo chmod 644 simsun.ttc 更新字体缓存: 代码: sudo mkfontscale 代码: sudo mkfontdir 代码: sudo fc-cache -fsv 安装chrome扩......

wangxuwei ⋅ 33分钟前 ⋅ 0

利用 ssh 传输文件

Linux 下一般可以用 scp 命令通过 ssh 传送文件: #把服务器上的 /home/user/a.txt 发送到本机的 /var/www/local_dir 目录下scp username@servername:/home/user/a.txt /var/www/local_dir...

大灰狼时间 ⋅ 43分钟前 ⋅ 0

web3j教程:android和java程序员如何使用web3j开发区块链以太坊

如何使用web3j为Java应用或Android App增加以太坊区块链支持,本教程内容即涉及以太坊中的核心概念,例如账户管理包括账户的创建、钱包创建、交易转账,交易与状态、智能合约开发与交互、过滤...

智能合约 ⋅ 今天 ⋅ 0

web3j开发java或android以太坊智能合约快速入门

web3j简介 web3j是一个轻量级、高度模块化、响应式、类型安全的Java和Android类库提供丰富API,用于处理以太坊智能合约及与以太坊网络上的客户端(节点)进行集成。 可以通过它进行以太坊区块链...

笔阁 ⋅ 今天 ⋅ 0

一起读书《深入浅出nodejs》-异步I/O

异步I/O “异步”这个名词其实很早就诞生了,但它大规模流行却是在Web 2.0浪潮中,它伴随着AJAX的第一个A(Asynchronous)席卷了Web。 为什么要异步I/O 关于异步I/O为何在Node里如此重要,这与...

小草先森 ⋅ 今天 ⋅ 0

JVM各种问题

1、如果启动什么都不设,会怎样? 先来看一个命令 [root@localhost bin]# java -XX:+PrintCommandLineFlags -version -XX:InitialHeapSize=29899008 -XX:MaxHeapSize=478384128 -XX:+PrintCo......

算法之名 ⋅ 今天 ⋅ 0

SAS笔记-宏2

宏是一种文本,一般来说其编译是在程序执行之前。 宏变量的创建 %let语句 %let macro_variables = text; %let是常见的宏变量建立方式,其编译就在执行前。如下例中,想要宏变量test等于数据集...

tonorth123 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部