开发:NT服务中的事件报告问题(100分)

  • 主题发起人 主题发起人 shiyj
  • 开始时间 开始时间
S

shiyj

Unregistered / Unconfirmed
GUEST, unregistred user!
在开发NT服务的时候,可以使用 ReportEvent 将服务的特定信息写入系统日志中去,其中需要指定几个参数。在 Delphi 编程语言中,可以使用 TService.LogMessage 方法达到类似的目的。按照 MS 的开发文档,事件中的参数“事件ID”是一个标志,指定此事件在一个消息文档中的入口。请问这个消息文档是怎么指定的?<br>或者我不需要这一项,应该怎么解决?简单的将此参数指定为 0 (Delphi中的默认值),在 WINNT 的事件查看器中将看到“找不到资源,事件无法解释”之类的一段文字。<br><br>谢谢。
 
Delphi 编写Windows NT服务 <br><br><br>1.产生一个Win32服务应用 <br><br>  产生一个Win32服务应用,选择File|New菜单,在New Items页中选择Service Application。这样在你的工程里加入一个全局变量命名的应用,它是 TserviceApplication类型。每个服务工程自动的声明一个TServiceApplication 实例,并不需要直接的对它编程。另外自动产生一个Tservice对象。 <br>  当你产生一个服务应用,你会在设计环境中看到一个窗口,它对应了一个服务 (Tservice)。在Object Inspector中设置它的属性和事件以实现它。在你的服务应用中可以加入其他的服务。不要将Service加入在一个非Service Application中。当加入一个Tservice对象时,因为服务,应用将不产生事件请求和使用合适的窗口调用。 <br><br><br><br>2.TServiceApplication <br><br>  TServiceApplication封装了windows NT Service Application。它提供服务应用的基本行为框架。它包含Tservice对象,每个Tservice封装了一个NT服务。 服务应用提供服务产生、安装、注册、分发和卸载的方法。 <br><br><br><br>注意,不要在工程的uses列表中加入Forms或HtppApp,因为这些单元有些 <br><br>Aplication变量有冲突。 <br><br><br><br>3.Tservice <br><br>每个Tservice都有一个线程。 <br><br>特性 <br><br>AllowPause <br><br>AllowStop <br><br>Dependencies <br><br>DisplayName <br><br>ErrCode <br><br>ErrorSeverity <br><br>Interactive <br><br>LoadGroup <br><br>Param <br><br>ParamCount <br><br>Password <br><br>ServiceStartName <br><br>ServiceThread <br><br><br><br>ServiceType <br><br>StartType <br><br>Status <br><br>TagID <br><br>Terminated <br><br>WaitHint <br><br>Win32ErrCode <br><br><br><br>方法: <br><br>Create <br><br>Destroy <br><br>GetServiceController <br><br>LogMessage <br><br>ReportStatus <br><br><br><br>事件 <br><br>AfterInstall <br><br>AfterUninstall <br><br>BeforeInstall <br><br>BeforeUninstall <br><br>OnContinue <br><br>OnExecute <br><br>OnPause <br><br>OnShutdown <br><br>OnStart <br><br>OnStop <br><br><br><br>4.样例 <br>  例子使用一个TserverSocket,端口设为80,这个例子将在c:/temp目录下产生一个文本文件,名字为WebLogxxx.log(xxx是线程IDThreadID)。看运行结果:启动程序,打开一个Web浏览器,键入localhost,等待浏览器将超时,然后在c:/temp中将有一个Weblogxxx.log文件。 <br><br>Interface <br><br>uses <br><br><br><br>Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs, <br><br>ScktComp; <br><br><br><br>type <br><br><br><br>TService1 = class(Tservice) <br><br>ServerSocket1: TServerSocket; <br><br>procedure ServerSocket1ClientRead(Sender: Tobject; <br><br>Socket: TCustomWinSocket); <br><br>procedure Service1Execute(Sender: Tservice); <br><br>private <br><br>{ Private declarations } <br><br>Stream: TMemoryStream; <br><br>public <br><br>function GetServiceController: PServiceController; override; <br><br>{ Public declarations } <br><br>end; <br><br><br><br>var <br><br><br><br>Service1: TService1; <br><br><br><br>implementation <br><br>{$R *.DFM} <br><br>procedure ServiceController(CtrlCode: Dword); stdcall; <br><br><br><br>begin <br><br>Service1.Controller(CtrlCode); <br><br>end; <br><br><br><br>function TService1.GetServiceController: PServiceController; <br><br><br><br>begin <br><br>Result := @ServiceController; <br><br>end; <br><br><br><br>procedure TService1.ServerSocket1ClientRead(Sender: Tobject; <br><br><br><br>Socket: TCustomWinSocket); <br><br>var <br><br>Buffer: Pchar; <br><br><br><br>begin <br><br><br><br>Buffer := nil; <br><br><br><br>while Socket.ReceiveLength &gt; 0 do begin <br><br><br><br>try <br><br>Buffer := AllocMem(Socket.ReceiveLength); <br><br>Socket.ReceiveBuf(Buffer^, Socket.ReceiveLength); <br><br>Stream.Write(Buffer^, StrLen(Buffer)); <br><br>finally <br><br>FreeMem(Buffer); <br><br>end; <br><br><br><br>Stream.Seek(0, soFromBeginning); <br><br><br><br>Stream.SaveToFile('c:/Temp/Weblog' + IntToStr(ServiceThread.ThreadID) + '.lo <br><br>'); <br><br>end; <br><br>end; <br><br><br><br>procedure TService1.Service1Execute(Sender: Tservice); <br><br><br><br>begin <br><br>Stream := TMemoryStream.Create; <br><br>try <br><br>ServerSocket1.Port := 80; // WWW port <br><br>ServerSocket1.Active := True; <br><br><br><br>while not Terminated do begin <br><br><br><br>ServiceThread.ProcessRequests(False); <br><br>end; <br><br><br><br>ServerSocket1.Active := False; <br><br><br><br>finally <br><br>Stream.Free; <br><br>end; <br><br>end; <br><br><br><br>end.<br><br><br><br>参见http://www.thedelphimagazine.com/Samples/1655/1655.htm
 
大虾,你这个是通用的NT服务开发示例。我不是问这个问题。我是说,我想为我的NT服务记录日志,不使用自己写LOG文件,而是记到WINDOWS的日志中去。对于WINDOWS来说是使用API函数 ReportEvent 实现的。但是其中的几个参数含义不好使用。
 
后退
顶部