创建NT服务程序.docx

上传人:b****3 文档编号:4613720 上传时间:2022-12-07 格式:DOCX 页数:6 大小:19.68KB
下载 相关 举报
创建NT服务程序.docx_第1页
第1页 / 共6页
创建NT服务程序.docx_第2页
第2页 / 共6页
创建NT服务程序.docx_第3页
第3页 / 共6页
创建NT服务程序.docx_第4页
第4页 / 共6页
创建NT服务程序.docx_第5页
第5页 / 共6页
点击查看更多>>
下载资源
资源描述

创建NT服务程序.docx

《创建NT服务程序.docx》由会员分享,可在线阅读,更多相关《创建NT服务程序.docx(6页珍藏版)》请在冰豆网上搜索。

创建NT服务程序.docx

创建NT服务程序

资料范本

 

本资料为word版本,可以直接编辑和打印,感谢您的下载

 

创建NT服务程序

 

地点:

__________________

时间:

__________________

 

说明:

本资料适用于约定双方经过谈判,协商而共同承认,共同遵守的责任与义务,仅供参考,文档可直接下载或修改,不需要的部分可直接删除,使用时请详细阅读内容

附录B创建NT服务程序

服务程序通常运行在后台,它可以使计算机更加有用。

有用是相对于特定的个人或组织而言的。

服务程序最好的例子是IIS服务器。

当在一台高性能的服务器或PC上安装了IIS后,IIS就作为后台服务运行并向浏览您的Web站点的人们提供Web页面。

同一领域的其他服务还包括FTP、SMTP以及Telnet服务器。

事件日志和WindowsInstaller也都作为服务运行。

实际的程序中服务的候选者可能具有如下特征:

运行时没有活动的用户输入,无论是否有人登录都需要运行。

IIS是一个很好的例子。

在实际开发环境中,我曾经将不断的传输并验证事务的程序作为服务来开发。

注意:

VisualBasic.NET支持建立NT服务程序。

Delphi直接地支持建立WindowsNT(包括Windows2000或WindowsNT5.0)服务程序。

建立NT服务的功能并非对所有工具都是固有的。

例如,MicrosoftVisualBasic6.0及更早的版本无法直接建立服务程序。

附录B通过示范一个自动发送IIS日志文件的程序,讨论了建立WindowsNT服务程序的基本概念。

B.1创建服务程序

建立服务程序最容易的方法是从NewItems对话框中启动ServiceApplication。

可以注意到还有一个Service项。

Service可以向已有的程序添加一个TService模块,但定义新的服务时,需要选择ServiceApplication。

当单击ServiceApplication后,Delphi将创建一个新的工程。

在新工程的.DPR源文件的uses子句中,首先引用了SvcMgr。

另外,工程中还添加了一个包含TService类的单元。

TService类继承了TDataModule,可以在其中添加非可视化控件和服务程序代码。

不要在工程源文件中包括Forms和HttpApp单元。

SvcMgr、Forms和HttpApp都定义了一个全局的Application对象,这会导致服务程序中出现冲突。

注意:

在Forms和SvcMgr单元中确实存在全局对象Application,而在HttpApp.pas的beta版实现中并未发现Application变量。

关于联合使用这三个单元的警告摘自Delphi的帮助文件。

当然,试验总是可以的,但应该事先预见到Application对象可能造成的冲突。

服务程序是很直观的。

本书的光盘上包含了ServiceApp.dpr文件。

该程序会等待一个预定义的时间量。

然后将IIS的日志文件发送到指定的邮件接收者。

该示例程序对大部分变量进行了硬编码,但从整本书中都可以看到,在外部对应用程序数据进行配置是一个相当直接的过程。

例如,邮件接收者、发送的信息、以及定时器间隔都可以存储在注册表中,无需重新编译程序即可进行修改(第15章涵盖了将应用程序数据持久存储到注册表的内容,第16章则涉及了INI文件的使用,因此在这里我们不再重复该信息)。

服务程序的基本框架是由Delphi生成的,您只需编写定义服务的代码。

B.1.1定义邮件发送器服务

当在服务控制管理器(即ServiceControlManager或SCM,细节请参考“服务控制管理器”一节)中启动服务时,Delphi调用TService模块中的OnExecute事件方法,您可以自行定义该方法。

OnExecute事件方法中所需的基本代码是一个while循环,这样服务程序就可以处理请求。

whileNotTerminateddo

ServiceThread.ProcessRequests(False);

该代码与Windows中处理信息队列的循环非常相似。

ServiceThread对象是服务程序中每个服务的专用线程。

只要服务尚未被服务控制管理器停止,NotTerminated的结果都是True。

由于日志文件邮件发送服务会在固定的时间间隔向接收者发送IIS日志文件,因此我们需要向OnExecute事件方法添加的代码就是:

在循环开始前使定时器生效,在循环结束后使定时器失效。

在示例程序中,OnExecute事件处理程序的代码如下。

procedureTMyService.ServiceExecute(Sender:

TService);

begin

Timer1.Enabled:

=True;

whileNotTerminateddo

ServiceThread.ProcessRequests(False);

Timer1.Enabled:

=False;

end;

当服务启动后,定时器将生效。

代码一直在while循环中运行,直至服务停止,最后定时器也将失效。

当时间间隔到达后,当天的日志将发送到预先指定的接收者。

执行这些任务的代码如下。

functionTMyService.GetLogFileName:

string;

const

sLogFileName=

'"c:

\winnt\system32\LogFiles\W3SVC1\ex"yymmdd".log"';

begin

{$IFOPTD+}

result:

=FormatDateTime(sLogFileName,EncodeDate(2000,12,

27));

{$ELSE}

result:

=FormatDateTime(sLogFileName,Date);

{$ENDIF}

end;

procedureTMyService.Timer1Timer(Sender:

TObject);

var

FileName:

string;

begin

FileName:

=GetLogFileName;

if(NotFileExists(FileName))thenexit;

IdSMTP1.Connect;

try

IdMessage1.Body.LoadFromFile(GetLogFileName);

IdSMTP1.Send(IdMessage1);

finally

IdSMTP1.Disconnect;

end;

end;

提示:

可以将纯文本嵌入到FormatDataTime函数中,把非日期掩码的文本使用双引号包裹起来即可。

这是个有用的技巧,可用于创建带有动态日期的文件名。

第一个函数GetLogFileName中,如果处于调试状态,那么$IFOPTD+编译器指令生效,将使用常量文件名,否则$ELSE指令生效,将使用动态文件名。

OnTimer事件确定当天的日志文件名。

如果文件已存在(IIS管理器中的日志选项已生效,又有人访问了您的站点),文件的内容将装载到TIdMessage的TStrings类型特性Body中(关于TIdMessage组件和Body特性的更多信息,请参见第16章)。

日志文件的内容通过已连接的TIdSTMP组件发送。

可以注意到,邮件的接收者并不是动态编码的。

如果要使接收者也成为动态的,需要从某些持久性的数据源读取必要的特性值。

关于如何动态地读取发送者、接收者以及邮件服务器的信息,可以参考第16章的SimplePop3例子。

B.2安装服务程序

Delphi服务程序可以在命令行安装,运行程序时添加/INSTALL开关即可。

使用/UNINSTALL可以卸载服务,而使用/SILENT开关则可以避免显示表示安装或卸载的成败情况的对话框。

当安装或卸载服务时,将显示一个对话框,要求用户输入。

如果服务的设置是在另一个更大的安装过程中进行,您可能不希望挂起当前的安装进程来等待用户输入;而使用/SILENT开关就可以避免出现该对话框。

下面的例子示范了如何从命令行安装及卸载服务程序。

Serviceapp/INSTALL

Serviceapp/UNINSTALL

Serviceapp/INSTALL/SILENT

前两个例子显示一个对话框,表示成功或失败,而第三个例子则不显示。

服务程序实例是serviceap.exe。

当安装服务时,服务并不启动。

您需要打开服务控制管理器或重启计算机来启动服务。

反过来,卸载服务时,该服务并不立即从服务列表中删除(在Windows2000中是这样),直到下次打开服务控制管理器时才会删除。

在服务控制管理器中,服务并非按照服务程序的名字排序的,而是按照服务对象名排序的。

从上一节的列出代码可知,本附录创建的服务类是TMyService;如果查看一下服务模块的Name特性,可以看到服务的名字是MyService。

MyService将显示在服务控制管理器中,如图B.1所示。

图B.1服务控制管理器,当前焦点是MyService,即本附录创建的服务

B.3使用服务控制管理器

图B.1所示的服务控制管理器与VCR控件的基本功能很相似。

用鼠标选定服务,然后单击StartService按钮即可启动服务,该按钮与VCR中的Play按钮类似。

单击Stop按钮可停止服务,后两个按钮分别是Pause和Restart。

右键单击服务,可以显示上下文菜单,然后打开服务属性对话框。

服务的默认行为是在重启时自动启动,但服务的启动类型、登录信息、故障恢复等设置都是可以改变的,还可以设置服务是否与桌面进行交互。

“允许服务与桌面交互”意味着服务可以有用户界面。

例如,如果服务有些选项是可由用户配置的,那么使服务与桌面进行交互,相应的程序将显示窗体并在任务栏上显示图标。

另外,还可以把服务作为单独的程序运行,以便修改用户可配置的选项。

B.4服务事件日志

服务可使用LogMessage方法直接向Windows事件日志服务写入信息。

LogMessage方法定义在TService中。

它有几个可选的参数,但只需传递一个文本字符串参数来表示要向Windows事件日志写入的信息。

LogMessage('Starting',EVENTLOG_INFORMATION_TYPE);

上述LogMessage语句将把一个Application事件日志项写入Windows事件日志,事件查看器如图B.2所示。

前两个参数(见上面的代码)分别是将要写入日志的文本以及表示事件类型的常数。

还可以向LogMessage传递两个参数:

第三个参数为Category值,可以是任何对用户有意义的值,而第四个参数是信息ID号,表示与事件文件和特定的事件相关联的文本的ID。

图B.2Windows事件查看器,其中显示了上述代码中

调用的TService.LogMessage产生的事件日志项

B.5服务的调试

有两种途径可用于调试服务程序。

第一种是在单独的类中定义服务的工作部分,并在一个单独的程序中对其进行调试。

第二种是在服务运行时进行调试。

第一种途径是个好主意;把负责服务工作的类添加到通常的程序是测试服务行为的最容易的方法,而且保持了与工作台测试的思想的一致性。

我们使用第一种方法,在创建ServiceApp和TestMailer(本书光盘上也有)这两个程序时进行测试。

把同样的组件TIdMessage、TTimer和TIdSTMP添加到一个单独的程序,然后创建一个邮件发送器。

当找到TestMailer程序的缺陷后,所有的修改都更新到服务程序。

创建工作台或测试程序是很容易的,但并不总是够用。

第二种测试服务程序的途径是:

安装并运行服务程序,然后将其附加到Delphi中的运行进程。

按照下列步骤,即可在运行服务时调试ServiceApp.exe程序。

在命令行运行Serviceapp.exe/INSTALL,安装服务程序。

选择Start|Settings|ControlPanel|AdministrativeTools|Services,将运行Services小应用程序。

找到MyService,然后单击StartService工具栏按钮(这些步骤适用于Windows2000;在WindowsNT4.0中的步骤几乎相同)。

运行Delphi。

装载ServiceApp.dpr工程。

在Delphi中选择Run|AttachtoProcess菜单项。

在AttachtoProcess对话框(如图B.3所示)中,选中ShowSystemProcesses复选框。

找到ServiceApp.exe,然后单击Attach按钮。

在Delphi中,对工程源文件的OnExecute事件方法设置断点,然后按键F9。

图B.3AttachtoProcess对话框可用于将Delphi调试器附加到

已运行的进程上;这对于调试服务程序是很有用的

Delphi将把调试器附加到运行的服务程序上,并打开CPU对话框。

除非您阅读汇编语言非常流畅,否则CPU视图用处不大。

但当服务程序运行到断点时,将停止在断点上并切换到Delphi代码视图。

在用户通过Delphi获取对已运行服务的控制之后,即可像其他程序一样对服务进行步进和调试。

注意:

作为开发者,您应该对自己的PC具有管理员权限。

令人难以置信的是,有些组织信任开发者编写的代码但却不允许他们管理自己的PC。

现在的经济形势仍然很好,找一份新工作吧。

Delphi帮助文档提到,如果权限不足,那么附加到服务进程可能会失败。

当只要对PC拥有管理员权限,附加到运行的服务进程总是工作正常。

帮助主题“DebuggingServices”包含了调试服务的第三种途径,其中涉及到修改注册表设置,您可以参考。

B.6小结

像其他程序一样,服务也依赖于用户的需求。

如果您正在建立系统的一部分,而它需要不被注意的运行,即使没有用户登录也要运行,那么您可能需要建立一个服务程序。

正像本附录所示范的,许多技术都与通常的应用程序相同,而Borland已经把一些棘手的部分隐藏到了无所不在的Application对象中。

这对于开发者是个好消息。

许多在其他程序中使用的组件都可以用于服务程序,但通常服务程序并没有很多的用户界面。

WindowsNT允许服务与桌面进行交互,当大多数情况下这种交互只涉及到修改应用程序的设置,而不是交互用户输入。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1