⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 3.1.1 服务应用程序.htm

📁 Windows2000后台服务程序开发手册
💻 HTM
📖 第 1 页 / 共 4 页
字号:
                  size=2>Workstation</FONT></TD>
                <TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px" 
                  size=2>提供网路连结与通讯。</FONT></TD>
                <TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px" 
                  size=2>Services.exe</FONT></TD></TR></TBODY></TABLE></CENTER>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>Microsoft还提出了许多没有列在表3-1中的服务,像是Microsoft Exchange 
            Server、Microsoft Merchant Server以及Microsoft SQL 
            Server等,所有的这些服务应用程序皆被实作成服务,并且是Microsoft BackOffice套件的一部份。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>首先,最重要的是一个服务应程序只是一个32位元或64位元的可执行档,所以任何您已知之有关DLLs、结构化例外处理、内存应对档、虚拟内存、设备I/O、本机线程储存、线程同步、Unicode以及其他Windows工具皆可用于服务上。这表示对您来说,要转换一个已存在的伺服应用程序到服务应用程序应该相当容易且简单。</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>在Microsoft Windows 2000 Resource 
            Kit中包含了一个工具程序,叫做SrvAny.exe,它允许从远端启动一个已存在的应用程序,就像是一个真实的服务应用程序一般。然而,SrvAny并不允许以任何方式透过远端来管理应用程序,因此应该仅仅当作一个短期的解决办法使用。强烈地建议您将应用程序代码转成一个成熟的服务应用程序并且不要使用SrvAny工具程序。</FONT></P>
            <HR style="LINE-HEIGHT: 25px">

            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>第二,您应该要知道一个服务完全没有使用者介面的部份。大部份的服务锁在一个隐密地方的服务器上执行。所以您的服务若出现任何的使用者介面元件,像讯息对话方块,此时不会有使用者在机器前面看见它并按下它的按钮。就如您稍后会在本章看到的一样,任何出现的视窗可能会展现在一个时常变换使用者的工作站或是桌面上,如此一来,这个讯息的显示对使用者来说并没有意义。因为服务不会有使用者介面,所以无论您选择将您的服务实作成一个图形使用者介面(Graphical 
            User Interface, GUI)应用程序(以(w)WinMain做为程序的进入点)或是Console User 
            Interface(CUI)应用程序(以(w)main做为程序的进入点)都没有关系。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>假如一个服务不会显示任何的使用者介面,您要如何设定它呢?您要如何启动与停止一个服务?要如何送出服务的警告或错误讯息呢?如何使服务将关于执行效能的统计资料报告出来?这些问题的答案即是:一个服务可以被远端地管理。Windows提供一些管理的工具,这些工具能从其他连接到网路上的机器管理一个服务的执行,所以不需要为了某人而去实际地确认(甚至是实际去存取)执行服务的电脑。您可能早已熟悉以下这些工具:Microsoft 
            Management 
            Console(MMC)与其服务、事件检视器与系统监视器之嵌入式管理单元、登录编辑器与Net.exe命令列工具。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>这些工具是Windows为了简化服务应用程序编写者之开发所提供的工具,也能使一个管理者以一致的方式去管理本机与远端的机器。请注意,这些工具并非专门用在服务中,任何应用程序(或设备驱动程序)都可以利用它们。本书将在章节里讨论这些工具。</FONT></P></A><A 
            style="LINE-HEIGHT: 25px" name=203001>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#3e70d7 
            size=5><B style="LINE-HEIGHT: 25px">Windows服务通讯架构<BR 
            style="LINE-HEIGHT: 25px"> </B></FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>建立服务的工作需要以下叁种元件:</FONT></P><FONT style="LINE-HEIGHT: 25px" 
            face=arial color=#000000 size=2>
            <UL style="LINE-HEIGHT: 25px">
              <LI style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px" 
              face=arial color=#3e80d7 size=2><B 
              style="LINE-HEIGHT: 25px">&nbsp;服务控制管理员(Service Control 
              Manager,SCM,读作scum)&nbsp;</B></FONT>Windows 
              2000系统皆会包含服务控制管理员。这个元件存在Services.exe文件中,当作业系统启动以及系统关机时,它便会自动地被呼叫。SCM使用系统特权执行并提供一个统一与安全之控制服务应用程序的方法。SCM负责与许多服务沟通,告知它们开始启动、停止、暂停、继续等等。<BR 
              style="LINE-HEIGHT: 25px">  
              <LI style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px" 
              face=arial color=#3e80d7 size=2><B 
              style="LINE-HEIGHT: 25px">&nbsp;服务应用程序&nbsp;</B></FONT>服务只是一个包含与SCM沟通所需基础的应用程序,传送命令给服务,告知启动、停止、暂停、继续或停止工作。服务也会呼叫一些特定的函数,以将它的状态送回SCM。<BR 
              style="LINE-HEIGHT: 25px">  
              <LI style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px" 
              face=arial color=#3e80d7 size=2><B 
              style="LINE-HEIGHT: 25px">&nbsp;服务控制程序(Service Control Program, 
              SCP)&nbsp;</B></FONT>这是一个通常会显示使用者介面,允许使用者去启动、停止、暂停、继续以及其他所有安装在机器上之服务的控制。服务控制程序呼叫一些与SCM沟通的特定Windows函数。<BR 
              style="LINE-HEIGHT: 25px">  </LI></UL></FONT>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>图3-1说明了那些元件间彼此沟通的方式。注意SCP应用程序并没有直接与服务沟通;所有的通讯都会通过SCM。这里明确地说明了建立通过SCP与服务应用程序之远端管理的架构。实作一个使您的SCP应用程序直接与您的服务应用程序沟通的架构与通讯协定是可以的,但是您必须自己编写它们的讯程序代码。</FONT></P>
            <P><BR style="LINE-HEIGHT: 25px"> </P>
            <CENTER style="LINE-HEIGHT: 25px">
            <P><INPUT id=1 
            style="WIDTH: 618px; LINE-HEIGHT: 25px; HEIGHT: 298px" type=image 
            height=357 width=736 src="3.1.1 服务应用程序.files/3-1.gif" size=1 
            border=0 &#111nclick="imgclick"></P></CENTER>
            <CENTER style="LINE-HEIGHT: 25px">
            <TABLE style="LINE-HEIGHT: 25px" border=0>
              <TBODY style="LINE-HEIGHT: 25px">
              <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">&nbsp;图3-1&nbsp;</B></FONT>Windows服务的通讯机制</FONT></TD></TR></TBODY></TABLE></CENTER>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>在这叁个部分中, 您绝对不会执行到SCM。Microsoft实作了SCM并将它封装到每一个Windows 
            2000的版本中。您要实作的是服务与SCPs。本章会涵盖您应该了解之设计与实作服务的内容,而在下一章则会说明编写SCP的细节。</FONT></P></A><A 
            style="LINE-HEIGHT: 25px" name=203002>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#3e70d7 
            size=5><B style="LINE-HEIGHT: 25px">包含在Windows中的服务控制程序(SCP)<BR 
            style="LINE-HEIGHT: 25px"> </B></FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>在我们探讨如何编写一个服务之前,您至少必需知道一个SCP可以控制一个服务。所以我会开始检查一些包含在Windows中的SCP应用程序。</FONT></P>
            <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>您应该要最熟悉的SCP应用程序是服务嵌入式管理单元,如图3-2所示。这个嵌入式管理单元显示了所有安装在目的机器上的服务清单。在名称与描述栏中可以发现每个服务的名称并提供服务函数的说明资讯。状态栏显示着哪一个服务是启动、暂停或停止(空白项表示「已停止」)。启动类型栏显示着什么时候应该唤起服务,而登入身份栏则显示了当服务执行时所使用的安全性内容。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>这个资讯保存在SCM的资料库中,并存在以下子机码(Subkey)的登录中:</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\Services</PRE></FONT></DIV>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>您应该不会直接存取到这个子机码;反之,SCP应该呼叫Windows函数(在下一章讨论)并操作这个子机码中的资料库。直接地修改这个机码内容会发生不可预料的结果。当您安装一个包含服务的产品时,该产品的安装程序即是一个增加服务资讯到SCM资料库的SCP应用程序。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>您可以在电脑管理主控台左边窗格中选择电脑管理节点,以及从执行功能表中选择连线到另一台电脑,来观看一个远端SCM的服务资料库。</FONT></P>
            <P><BR style="LINE-HEIGHT: 25px"> </P>
            <CENTER style="LINE-HEIGHT: 25px">
            <P><INPUT id=2 style="LINE-HEIGHT: 25px" type=image height=446 
            width=610 src="3.1.1 服务应用程序.files/3-2.gif" border=0 
            &#111nclick="imgclick"></P></CENTER>
            <CENTER style="LINE-HEIGHT: 25px">
            <TABLE style="LINE-HEIGHT: 25px" border=0>
              <TBODY style="LINE-HEIGHT: 25px">
              <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">&nbsp;图3-2&nbsp;</B></FONT>服务嵌入式管理单元</FONT></TD></TR></TBODY></TABLE></CENTER>
            <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>所有包含在Windows中的服务皆会以本机安全内容登入。这是一个享有高度特权的帐号,而且强烈建议您所编写的任何服务也要使用本机帐号。</FONT></P>
            <HR style="LINE-HEIGHT: 25px">

            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>现在您会开始看到服务嵌入式管理单元,您可能会怀疑是否能够用它来完成所有的任务。这里是一些普通的操作:</FONT></P><FONT 
            style="LINE-HEIGHT: 25px" face=arial color=#000000 size=2>
            <UL style="LINE-HEIGHT: 25px">
              <LI style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px" 
              face=arial color=#3e80d7 size=2><B 
              style="LINE-HEIGHT: 25px">&nbsp;启动一个服务&nbsp;</B></FONT>管理者可以从清单选择并按下工具列上的启动按钮来启动一个服务。只有启动类型为自动或手动的服务可以被启动,停用的服务则不行。停用一个服务在解决机器上的问题时是非常有用的。<BR 
              style="LINE-HEIGHT: 25px">  
              <LI style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px" 
              face=arial color=#3e80d7 size=2><B 
              style="LINE-HEIGHT: 25px">&nbsp;停止一个服务&nbsp;</B></FONT>管理者要停止一个服务时,只需选择一个服务并按下工具列上的停止按钮即可。要注意有一些服务在它们启动后并不允许它们自己停止。事件记录服务即是一个例子,它只有在机器关机时才能停止。<BR 
              style="LINE-HEIGHT: 25px">  
              <LI style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px" 
              face=arial color=#3e80d7 size=2><B 
              style="LINE-HEIGHT: 25px">&nbsp;暂停与继绩执行一个服务&nbsp;</B></FONT>当管理者选择一个正在执行的服务并按下工具列上的暂停钮后,即可暂停一个服务的执行。注意大部份的服务并不允许它们自己暂停执行。也要注意「暂停」并没有明确的定义,对于一个服务,暂停表示在该服务完成了那些未解决的要求前不会再接受客户端的要求;对另一个服务来说,暂停执行表示该服务不能再处理任何操作。暂停服务可以在按工具列上的启动钮时被继续执行。<BR 
              style="LINE-HEIGHT: 25px">  
              <LI style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px" 
              face=arial color=#3e80d7 size=2><B 
              style="LINE-HEIGHT: 25px">&nbsp;重新启动一个服务&nbsp;</B></FONT>管理者可以透过选择一个正在执行或被暂停的服务并且按下工具列上的重新启动钮来重新启动一个服务。重新启动一个服务会引起一个停止该服务然后启动该服务的动作。这是一个简单方便的特色,而且当您在对您的服务进行除错时,这个功能会非常有帮助。<BR 
              style="LINE-HEIGHT: 25px">  </LI></UL></FONT>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>前面的清单说明了百分之九十九的管理者所做的服务嵌入式管理单元工作,但是嵌入式管理单元也可以被用来重新设定一个服务。要改变一个服务器的设定时,您要选择服务并且显示出它的内容对话方块。这个对话方块包含了四个页签,每一个页签皆允许管理者去重新设定所选的服务。以下的章节中会讨论更改设定的部份。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#3e74d7 
            size=3><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>一般页签(如图3-3所示)允许管理者去检查与重新设定服务的一般资讯。您需要去了解的第一个真相是,每一个服务都有两个字串名称:一个内部名称(使用于计划性的目的)以及一个显示名称(一个显示给管理者与使用者看的字串)。在被加入服务资料库后,服务的内部名称即不能改变,但是管理者可以修改该服务的显示名称与内容。一般页签中也显示服务的执行程序路径,而它并不允许管理者改变它(这是一个使用页签的限制,并非系统的)。管理者可以改变服务的启动类型至以下所列之一:</FONT></P><FONT 
            style="LINE-HEIGHT: 25px" face=arial color=#000000 size=2>
            <UL style="LINE-HEIGHT: 25px">
              <LI style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px" 
              face=arial color=#3e80d7 size=2><B 
              style="LINE-HEIGHT: 25px">&nbsp;自动&nbsp;</B></FONT>服务的其中一个特色即是SCM可以自动地启动。假如该服务有一个设定为自动的启动类型,则SCM会在作业系统启动时产生该服务。请注意自动服务在任何使用者登入机器前即已执行。事实上,许多执行Windows的设定只执行服务—即没有任何采互动式的登入情形。例如,某机器执行Windows与服务器服务,并允许一个在网路上的客户端机器存取子目录、文件以及打印机。<BR 
              style="LINE-HEIGHT: 25px">  
              <LI style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px" 
              face=arial color=#3e80d7 size=2><B 
              style="LINE-HEIGHT: 25px">&nbsp;手动&nbsp;</B></FONT>一个设定为手动的服务即告诉SCM不要去启动该服务。管理者可以使用SCP以手动的方式启动一个服务。一个手动的服务也可以依据其他已启动的服务来启动。我们会在下一章说明依存关系的内容。<BR 
              style="LINE-HEIGHT: 25px">  
              <LI style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px" 
              face=arial color=#3e80d7 size=2><B 
              style="LINE-HEIGHT: 25px">&nbsp;停用&nbsp;</B></FONT>一个停用的服务即告诉SCM在任何情况下皆不要启动服务。当您手动地为您的机器指定一个IP位址,而非让它动态地从DHCP 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -