附录 创建服务程序

上传人:lb2****090 文档编号:241886216 上传时间:2022-01-17 格式:DOCX 页数:7 大小:70.48KB
返回 下载 相关 举报
附录 创建服务程序_第1页
第1页 / 共7页
附录 创建服务程序_第2页
第2页 / 共7页
附录 创建服务程序_第3页
第3页 / 共7页
附录 创建服务程序_第4页
第4页 / 共7页
附录 创建服务程序_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《附录 创建服务程序》由会员分享,可在线阅读,更多相关《附录 创建服务程序(7页珍藏版)》请在金锄头文库上搜索。

1、附录B 创立NT效劳程序效劳程序通常运行在后台,它可以使计算机更加有用。有用是相对于特定的个人或组织而言的。效劳程序最好的例子是IIS效劳器。当在一台高性能的效劳器或PC上安装了IIS后,IIS就作为后台效劳运行并向浏览您的Web站点的人们提供Web页面。同一领域的其他效劳还包括FTP、SMTP以及Telnet效劳器。事件日志和Windows Installer也都作为效劳运行。实际的程序中效劳的候选者可能具有如下特征:运行时没有活动的用户输入,无论是否有人登录都需要运行。IIS是一个很好的例子。在实际开发环境中,我曾经将不断的传输并验证事务的程序作为效劳来开发。注意:Visual Basic

2、 .NET支持建立NT效劳程序。Delphi直接地支持建立Windows NT包括Windows 2000或Windows NT 5.0效劳程序。建立NT效劳的功能并非对所有工具都是固有的。例如,Microsoft Visual Basic 6.0及更早的版本无法直接建立效劳程序。附录B通过示范一个自动发送IIS日志文件的程序,讨论了建立Windows NT效劳程序的根本概念。B.1 创立效劳程序建立效劳程序最容易的方法是从New Items对话框中启动Service Application。可以注意到还有一个Service项。Service可以向已有的程序添加一个TService模块,但定义

3、新的效劳时,需要选择Service Application。当单击Service Application后,Delphi将创立一个新的工程。在新工程的.DPR源文件的uses子句中,首先引用了SvcMgr。另外,工程中还添加了一个包含TService类的单元。TService类继承了TDataModule,可以在其中添加非可视化控件和效劳程序代码。不要在工程源文件中包括Forms和HttpApp单元。SvcMgr、Forms和HttpApp都定义了一个全局的Application对象,这会导致效劳程序中出现冲突。注意:在Forms和SvcMgr单元中确实存在全局对象Application,而在

4、HttpApp.pas的beta版实现中并未发现Application变量。关于联合使用这三个单元的警告摘自Delphi的帮助文件。当然,试验总是可以的,但应该事先预见到Application对象可能造成的冲突。效劳程序是很直观的。本书的光盘上包含了ServiceApp.dpr文件。该程序会等待一个预定义的时间量。然后将IIS的日志文件发送到指定的邮件接收者。该例如程序对大局部变量进行了硬编码,但从整本书中都可以看到,在外部对应用程序数据进行配置是一个相当直接的过程。例如,邮件接收者、发送的信息、以及定时器间隔都可以存储在注册表中,无需重新编译程序即可进行修改第15章涵盖了将应用程序数据持久存

5、储到注册表的内容,第16章那么涉及了INI文件的使用,因此在这里我们不再重复该信息。效劳程序的根本框架是由Delphi生成的,您只需编写定义效劳的代码。B.1.1 定义邮件发送器效劳当在效劳控制管理器即Service Control Manager或SCM,细节请参考“效劳控制管理器一节中启动效劳时,Delphi调用TService模块中的OnExecute事件方法,您可以自行定义该方法。OnExecute事件方法中所需的根本代码是一个while循环,这样效劳程序就可以处理请求。while Not Terminated doServiceThread.ProcessRequests(False

6、);该代码与Windows中处理信息队列的循环非常相似。ServiceThread对象是效劳程序中每个效劳的专用线程。只要效劳尚未被效劳控制管理器停止,Not Terminated的结果都是True。由于日志文件邮件发送效劳会在固定的时间间隔向接收者发送IIS日志文件,因此我们需要向OnExecute事件方法添加的代码就是:在循环开始前使定时器生效,在循环结束后使定时器失效。在例如程序中,OnExecute事件处理程序的代码如下。procedure TMyService.ServiceExecute(Sender: TService);beginTimer1.Enabled := True;w

7、hile Not Terminated doServiceThread.ProcessRequests(False);Timer1.Enabled := False;end;当效劳启动后,定时器将生效。代码一直在while循环中运行,直至效劳停止,最后定时器也将失效。当时间间隔到达后,当天的日志将发送到预先指定的接收者。执行这些任务的代码如下。function TMyService.GetLogFileName: string;constsLogFileName =c:winntsystem32LogFilesW3SVC1exyymmdd.log;begin$IFOPT D+result :=

8、 FormatDateTime( sLogFileName, EncodeDate( 2000, 12,27);$ELSEresult := FormatDateTime( sLogFileName, Date );$ENDIFend;procedure TMyService.Timer1Timer(Sender: TObject);varFileName : string;beginFileName := GetLogFileName;if( Not FileExists(FileName) then exit;IdSMTP1.Connect;tryIdMessage1.Body.LoadF

9、romFile( GetLogFileName );IdSMTP1.Send( IdMessage1 );finallyIdSMTP1.Disconnect;end;end;提示:可以将纯文本嵌入到FormatDataTime函数中,把非日期掩码的文本使用双引号包裹起来即可。这是个有用的技巧,可用于创立带有动态日期的文件名。第一个函数GetLogFileName中,如果处于调试状态,那么$IFOPT D+编译器指令生效,将使用常量文件名,否那么$ELSE指令生效,将使用动态文件名。OnTimer事件确定当天的日志文件名。如果文件已存在IIS管理器中的日志选项已生效,又有人访问了您的站点,文件的

10、内容将装载到TIdMessage的TStrings类型特性Body中关于TIdMessage组件和Body特性的更多信息,请参见第16章。日志文件的内容通过已连接的TIdSTMP组件发送。可以注意到,邮件的接收者并不是动态编码的。如果要使接收者也成为动态的,需要从某些持久性的数据源读取必要的特性值。关于如何动态地读取发送者、接收者以及邮件效劳器的信息,可以参考第16章的SimplePop3例子。B.2 安装效劳程序Delphi效劳程序可以在命令行安装,运行程序时添加/INSTALL开关即可。使用/UNINSTALL可以卸载效劳,而使用 /SILENT开关那么可以防止显示表示安装或卸载的成败情况

11、的对话框。当安装或卸载效劳时,将显示一个对话框,要求用户输入。如果效劳的设置是在另一个更大的安装过程中进行,您可能不希望挂起当前的安装进程来等待用户输入;而使用 /SILENT开关就可以防止出现该对话框。下面的例子示范了如何从命令行安装及卸载效劳程序。Serviceapp /INSTALLServiceapp /UNINSTALLServiceapp /INSTALL /SILENT前两个例子显示一个对话框,表示成功或失败,而第三个例子那么不显示。效劳程序实例是serviceap.exe。当安装效劳时,效劳并不启动。您需要翻开效劳控制管理器或重启计算机来启动效劳。反过来,卸载效劳时,该效劳并不

12、立即从效劳列表中删除在Windows 2000中是这样,直到下次翻开效劳控制管理器时才会删除。在效劳控制管理器中,效劳并非按照效劳程序的名字排序的,而是按照效劳对象名排序的。从上一节的列出代码可知,本附录创立的效劳类是TMyService;如果查看一下效劳模块的Name特性,可以看到效劳的名字是MyService。MyService将显示在效劳控制管理器中,如图B.1所示。图B.1 效劳控制管理器,当前焦点是MyService,即本附录创立的效劳B.3 使用效劳控制管理器图B.1所示的效劳控制管理器与VCR控件的根本功能很相似。用鼠标选定效劳,然后单击Start Service按钮即可启动效劳

13、,该按钮与VCR中的Play按钮类似。单击Stop按钮可停止效劳,后两个按钮分别是Pause和Restart。右键单击效劳,可以显示上下文菜单,然后翻开效劳属性对话框。效劳的默认行为是在重启时自动启动,但效劳的启动类型、登录信息、故障恢复等设置都是可以改变的,还可以设置效劳是否与桌面进行交互。“允许效劳与桌面交互意味着效劳可以有用户界面。例如,如果效劳有些选项是可由用户配置的,那么使效劳与桌面进行交互,相应的程序将显示窗体并在任务栏上显示图标。另外,还可以把效劳作为单独的程序运行,以便修改用户可配置的选项。B.4 效劳事件日志效劳可使用LogMessage方法直接向Windows事件日志效劳写

14、入信息。LogMessage方法定义在TService中。它有几个可选的参数,但只需传递一个文本字符串参数来表示要向Windows事件日志写入的信息。LogMessage( Starting, EVENTLOG_INFORMATION_TYPE );上述LogMessage语句将把一个Application事件日志项写入Windows事件日志,事件查看器如图B.2所示。前两个参数见上面的代码分别是将要写入日志的文本以及表示事件类型的常数。还可以向LogMessage传递两个参数:第三个参数为Category值,可以是任何对用户有意义的值,而第四个参数是信息ID号,表示与事件文件和特定的事件相关

15、联的文本的ID。图B.2 Windows事件查看器,其中显示了上述代码中 调用的TService.LogMessage产生的事件日志项B.5 效劳的调试有两种途径可用于调试效劳程序。第一种是在单独的类中定义效劳的工作局部,并在一个单独的程序中对其进行调试。第二种是在效劳运行时进行调试。第一种途径是个好主意;把负责效劳工作的类添加到通常的程序是测试效劳行为的最容易的方法,而且保持了与工作台测试的思想的一致性。我们使用第一种方法,在创立ServiceApp和TestMailer本书光盘上也有这两个程序时进行测试。把同样的组件TIdMessage、TTimer和TIdSTMP添加到一个单独的程序,然后创立一个邮件发送器。当找到TestMailer程序的缺陷后,所有的修改都更新到效劳程序。创立工作台或测试程序是很容易的,但并不总是够用。第二种测试效劳程序的途径是:安装并运行效劳程序,然后将其附加到Delphi中的运行进程。按照以下步骤,即可在运行效劳时调试ServiceApp.exe程序。1. 在命令行运行Serviceapp.exe /INSTALL,安装效劳程序。2. 选择Start | Settings | Control Panel | Administrative Tools | Services,将运行Services小应用程序。找

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号