3.1.3 服务应用程序.htm
来自「Windows2000后台服务程序开发手册」· HTM 代码 · 共 371 行 · 第 1/2 页
HTM
371 行
<TR style="LINE-HEIGHT: 25px">
<TD style="LINE-HEIGHT: 25px" align=middle><FONT
style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2><FONT style="LINE-HEIGHT: 25px" face=arial
color=#3e80d7 size=2><B
style="LINE-HEIGHT: 25px"> 表3-3 </B></FONT>指示一个通知的控制码</FONT></TD></TR></TBODY></TABLE></CENTER>
<CENTER style="LINE-HEIGHT: 25px">
<TABLE style="LINE-HEIGHT: 25px" border=1>
<TBODY style="LINE-HEIGHT: 25px">
<TR style="LINE-HEIGHT: 25px">
<TH style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px"
size=2>控制码</FONT> </TH>
<TH style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px"
size=2>说明</FONT></TH></TR>
<TR style="LINE-HEIGHT: 25px">
<TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px"
size=2>SERVICE_CONTROL_PARAMCHANGE</FONT></TD>
<TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px"
size=2>定义参数被改变时通告服务。当一个服务正在执 行时,可以忽略或重新设定自己。</FONT></TD></TR>
<TR style="LINE-HEIGHT: 25px">
<TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px"
size=2>SERVICE_CONTROL_DEVICEEVENT</FONT></TD>
<TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px"
size=2>通告一个设备事件的服务。该服务必须呼叫RegisterDeviceNotification以取回这些通知讯息。</FONT></TD></TR>
<TR style="LINE-HEIGHT: 25px">
<TD style="LINE-HEIGHT: 25px"><FONT style="LINE: 25px"
size=2>SERVICE_CONTROL_HA, RDWAREPROFILECHANGE</FONT></TD>
<TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px"
size=2>当一个硬体设定档改变时通告服务。</FONT></TD></TR>
<TR style="LINE-HEIGHT: 25px">
<TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px"
size=2>SERVICE_CONTROL_POWEREVENT</FONT></TD>
<TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px"
size=2>通告一个电源事件给服务。</FONT></TD></TR>
<TR style="LINE-HEIGHT: 25px">
<TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px"
size=2>一个介于在128与255(包括)之间的数字</FONT></TD>
<TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px"
size=2>通告一个使用者定义事件给服务。</FONT></TD></TR></TBODY></TABLE></CENTER>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#3e72d7
size=4><B style="LINE-HEIGHT: 25px">控制码要求回报状态<BR
style="LINE-HEIGHT: 25px"> </B></FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>被HandlerEx函数执行的工作依据取回的控制码而有所不同。尤其是,动作要求控制码会要求在您的程序代码中得到特定的注意。当HandlerEx函数取回一个SERVICE_CONTROL_STOP、SERVICE_CONTROL_SHUTDOWN、SERVICE_
CONTROL_PAUSE或SERVICE_CONTROL_CONTINUE控制码时,SetServiceStatus必须被呼叫以告知对方已收到该控制码并且详细说明服务需要使用多久的时间以考虑自己开始从事状态改变之处理程序。例如,您告知经SERVICE_STATUS结构之dwCurrentState成员设定至SERVICE_STOP_PENDING、SERVICE_PAUSE_
PENDING或SERVICE_CONTINUE_PENDING的控制码已被接收。另外,HandlerEx函数必须在30秒内回传,或是SCP应用程序会再次认为该服务已经停止回应。如果SCM认为服务已停止回应,则它不会删除该服务,它只会回传一个失败至SCP以对服务控制码做初始化的动作。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>当一个停止、关机、暂停或继续的操作是悬而未决的,您必须也要指定您认为该操作会需要多久的时间来完成该工作。指定持续时间是有用的,因为一个服务可能无法立即地改变它自己的状态—即它可能必须等待一个网路要求完成或是资料被注入一个设备。您可以使用SERVICE_STATUS结构的dwCheckPoint与dwWaitHint成员来指示需要多久的时间以完成该状态的改变,就像您回报一个服务之第一次启动一样。如果您想要的话,您可以回报一个被dwCheckPoint成员增加与dwWaitHint成员设定去指示您预期该服务需要多久才能开始从事下一个步骤之周期性的进度。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>在服务完成了所有要求停止、关机、暂停或继续的动作时,SetServiceStatus应该再次被呼叫。此时您会设定dwCurrentStatus成员至SERVICE_STOPPED、SERVICE_PAUSED或SERVICE_RUNNING之控制码。当您回报了这叁个状态控制码之一时,因为服务已经完成了它的状态改变动作,所以dwCheckPoint与dwWaitHint成员应为0。</FONT></P>
<HR style="LINE-HEIGHT: 25px">
<P><FONT style="LINE-HEIGHT: 25px" face=Arial color=#3e77d7 size=3
Black><B style="LINE-HEIGHT: 25px">说明</B></FONT> </P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>在服务呼叫SetServiceStatus回报SERVICE_STOPPED时,SCM允许该服务可以执行30秒之久。如果服务在30秒后仍在执行中,若当时并没有其他的服务正在该处理程序中执行,则SCM会终止该服务的处理程序。</FONT></P>
<HR style="LINE-HEIGHT: 25px">
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>当HandlerEx函数收到一个SERVICE_CONTROL_INTERROGATE控制码时,该服务应该简单地告知设定dwCurrentState至服务的当前状态以及呼叫的SetServiceStatus已被接收(再一次说明,在建立SetServiceStatus呼叫前,设定dwCheckPoint与dwWaitHint为0)。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>当系统关机时,HandlerEx会接收一个SERVICE_CONTROL_SHUTDOWN的通知控制码。服务应该完成将任何资料储存所必需之行动的最小限度,并且最后应该呼叫SetServiceStatus以回报SERVICE_STOPPED。为了及时地确认一个机器的关机动作,只要必须做的话,一个服务应该处理这个控制码。在预设的情形下,系统只会给20秒的时间以关闭所有的服务。在20秒之后,SCM处理程序(Service.exe)会被删除,而且机器会继续完成关机的动作。这个20秒的期间是经由设定WaitToKillServiceTimeout值而来的,它包含在以下的登录子机码中:</FONT></P>
<DIV style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT
style="LINE-HEIGHT: 25px" face=Arial size=3><PRE style="LINE-HEIGHT: 25px">HKEY_LOCAL_MACHINE \SYSTEM \CurrentControlSet \Control</PRE></FONT></DIV>
<HR style="LINE-HEIGHT: 25px">
<P><FONT style="LINE-HEIGHT: 25px" face=Arial color=#3e77d7 size=3
Black><B style="LINE-HEIGHT: 25px">说明</B></FONT> </P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>当系统正在关机时,SCM会通知所有服务接受SERVICE_CONTROL_SHUTDOWN通知控制码。有一些服务可能会忽略这个控制码,一些可能会储存资料至磁盘中,另一些则可能会自己停止并终止执行。您必须非常小心地不去执行任何在您的服务中需要与其他服务关联的动作。这些其他的服务可能会存在一个「不适当」的状态或甚至必须终止执行。当在关机时,系统会完全地忽视服务的依存关系。Microsoft的目标是使系统能以尽可能快的速度关机。事实上,在您的服务收到它的通知前,其他的服务可能也会收到它们的关机通知。与这个关机通知顺序的问题是,您的服务所依赖的服务可能会在任何时间停止,而且您的服务必须处理这个情形。</FONT></P>
<HR style="LINE-HEIGHT: 25px">
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>通知控制码在之前已经列在表3-3中,您的HandlerEx函数应该处理该通知并且回传。除非通报回应迫使服务改变它的实施状态,否则不要呼叫SetServiceStatus函数。如果服务将要改变它的执行状态,则SetServiceStatus被呼叫去设定dwCurrentState、dwCheckPoint与dwWaitHint成员为像之前所讨论的适当值。</FONT></P></A></DIV></DIV<
p>
<P class=content_page><A
href="http://www.acejoy.com/Html/Article/network/5020061009101614_P2.html">上一页</A> <A
href="http://www.acejoy.com/Html/Article/network/5020061009101614.html">[1]</A> <A
href="http://www.acejoy.com/Html/Article/network/5020061009101614_P2.html">[2]</A> <STRONG><FONT
color=#ff0033>[3]</FONT></STRONG> </P>
<DIV></DIV><BR><BR></TD></TR></TBODY></TABLE>
<TABLE style="CLEAR: both" cellSpacing=0 cellPadding=0 width="97%">
<TBODY>
<TR>
<TD align=right>
<TABLE>
<TBODY>
<TR>
<TD>阅读:<SPAN id=news_hits></SPAN>
<SCRIPT src="3.1.3 服务应用程序.files/GetHits.htm"
type=text/JavaScript></SCRIPT>
次<BR>录入:<A
href="http://www.acejoy.com/User/Info.Asp?UserName=winston">winston</A><BR><BR></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD align=right>【 <A
href="http://www.acejoy.com/Comment.asp?ChannelID=1&Action=Write&InfoID=50">评论</A>
】 【 <A
href="http://www.acejoy.com/User/SendMail.asp?Title=Windows2000 服务器端应用程序开发设计指南- 服务应用程序(1)"
target=_blank>推荐</A> 】 【 <A href="javascript:window.print()">打印</A>
】 </TD></TR></TBODY></TABLE>
<TABLE style="CLEAR: both" width="97%" align=center>
<TBODY>
<TR>
<TD>上一篇:<A
title="标题:Windows2000 服务器端应用程序开发设计指南-设备I/O及线程间通讯(2) 作者:Jeffrey Richter Jason D. Clark 更新:2006-10-8 13:05:02 点击:464"
href="http://www.acejoy.com/Html/Article/network/4920061008130502.html">Windows2000
服务器端应用程序开发设计指南-设备I/O及线程间通讯(2)</A><BR>下一篇:<A
title="标题:Windows2000 服务器端应用程序开发设计指南- 服务应用程序(2) 作者:Jeffrey Richter Jason D. Clark 更新:2006-10-9 10:26:24 点击:557"
href="http://www.acejoy.com/Html/Article/network/5120061009102624.html">Windows2000
服务器端应用程序开发设计指南- 服务应用程序(2)</A> </TD></TR></TBODY></TABLE></TD>
<TD class=mr></TD></TR></TBODY></TABLE></DIV></DIV>
<DIV class=mframe>
<TABLE cellSpacing=0 cellPadding=0 width="100%" align=center>
<TBODY>
<TR>
<TD class=tl></TD>
<TD class=tm><SPAN class=tt>相关新闻</SPAN> </TD>
<TD class=tr></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width="100%" align=center>
<TBODY>
<TR>
<TD class=ml></TD>
<TD class=mm>
<TABLE height="100%" cellSpacing=5 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD vAlign=top>
<SCRIPT language=javascript
src="3.1.3 服务应用程序.files/GetCorrelative.htm"></SCRIPT>
</TD></TR></TBODY></TABLE></TD>
<TD class=mr></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width="100%" align=center>
<TBODY>
<TR>
<TD class=tl></TD>
<TD class=tm><SPAN class=tt>本文评论</SPAN> </TD>
<TD class=tr></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width="100%" align=center>
<TBODY>
<TR>
<TD class=ml></TD>
<TD class=mm>
<P> </P>
<TABLE height="100%" cellSpacing=5 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD vAlign=top>
<SCRIPT language=javascript
src="3.1.3 服务应用程序.files/Comment.htm"></SCRIPT>
</TD></TR></TBODY></TABLE></TD>
<TD class=mr></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width="100%" align=center>
<TBODY>
<TR>
<TD class=ml></TD>
<TD class=mm></TD>
<TD class=mr></TD></TR></TBODY></TABLE></DIV>
<TABLE id=footer cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR style="LINE-HEIGHT: 130%" align=middle>
<TD height=23> <A
href='javascript:window.external.addFavorite("http://www.acejoy.com","ACE开发者")'><FONT
color=#000000>加入收藏</FONT></A> - <A
href="http://www.acejoy.com/Help.asp?Action=aboutweb" target=_blank><FONT
color=#000000>关于本站</FONT></A> - <A class=Bottom
href="http://www.acejoy.com/Help.asp?Action=Copyright" target=_blank><FONT
color=#000000>版权申明</FONT></A> - <A class=Bottom
href="http://www.acejoy.com/Help.asp?Action=aboutweb" target=_blank><FONT
color=#000000>联系站长</FONT></A> - <A class=Bottom
href="http://www.acejoy.com/LinkSite.asp" target=_blank><FONT
color=#000000>友情链接</FONT></A> </TD></TR>
<TR align=middle>
<TD height=23>Copyright© 2004-2006 <A
href="http://www.acejoy.com/">http://www.acejoy.com/</A> .All Rights
Reserved <A href="http://www.miibeian.gov.cn/" target=_blank>京ICP备06055248
</A>
<SCRIPT language=JavaScript src="3.1.3 服务应用程序.files/stat.htm"
charset=gb2312></SCRIPT>
</TD></TR></TBODY></TABLE>
<DIV></DIV>
<DIV></DIV>
<DIV></DIV>
<DIV></DIV>
<DIV></DIV><!--Powered by:CreateLive CMS Version 3.1(www.acejoy.com) CreateDate:2007-3-4 10:50:42--></DIV></DIV></DIV></DIV></DIV></BODY></HTML>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?