Delphi 编写Windows NT服务

1.产生一个Win32服务应用 

  产生一个Win32服务应用,选择File|New菜单,在New Items页中选择Service Application。这样在
你的工程里加入一个全局变量命名的应用,它是 TserviceApplication类型。每个服务工程自动的声明一个
TServiceApplication 实例,并不需要直接的对它编程。另外自动产生一个TService对象。 
  当你产生一个服务应用,你会在设计环境中看到一个窗口,它对应了一个服务 (Tservice)。在Object 
Inspector中设置它的属性和事件以实现它。在你的服务应用中可以加入其他的服务。不要将Service加入在
一个非Service Application中。当加入一个TService对象时,因为服务,应用将不产生事件请求和使用合
适的窗口调用。 

2.TServiceApplication 

  TServiceApplication封装了windows NT Service Application。它提供服务应用的基本行为框架。
它包含TService对象,每个Tservice封装了一个NT服务。 服务应用提供服务产生、安装、注册、分发和卸
载的方法。 

注意,不要在工程的uses列表中加入Forms或HtppApp,因为这些单元有些 

Aplication变量有冲突。 

3.TService 

每个Tservice都有一个线程。 

特性 

AllowPause 

AllowStop 

Dependencies 

DisplayName 

ErrCode 

ErrorSeverity 

Interactive 

LoadGroup 

Param 

ParamCount 

Password 

ServiceStartName 

ServiceThread 

ServiceType 

StartType 

Status 

TagID 

Terminated 

WaitHint 

Win32ErrCode 

方法: 

Create 

Destroy 

GetServiceController 

LogMessage 

ReportStatus 

事件 

AfterInstall 

AfterUninstall 

BeforeInstall 

BeforeUninstall 

OnContinue 

OnExecute 

OnPause 

OnShutdown 

OnStart 

OnStop 

4.样例 
  例子使用一个TserverSocket,端口设为80,这个例子将在c:\temp目录下产生一个文本文件,名字为
WebLogxxx.log(xxx是线程IDThreadID)。看运行结果:启动程序,打开一个Web浏览器,键入localhost,
等待浏览器将超时,然后在c:\temp中将有一个Weblogxxx.log文件。 

interface 

uses 

Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs, 

ScktComp; 

type 

TService1 = class(TService) 

ServerSocket1: TServerSocket; 

procedure ServerSocket1ClientRead(Sender: TObject; 

Socket: TCustomWinSocket); 

procedure Service1Execute(Sender: TService); 

private 

{ Private declarations } 

Stream: TMemoryStream; 

public 

function GetServiceController: PServiceController; override; 

{ Public declarations } 

end; 

var 

Service1: TService1; 

implementation 

{$R *.DFM} 

procedure ServiceController(CtrlCode: DWord); stdcall; 

begin 

Service1.Controller(CtrlCode); 

end; 

function TService1.GetServiceController: PServiceController; 

begin 

Result := @ServiceController; 

end; 

procedure TService1.ServerSocket1ClientRead(Sender: TObject; 

Socket: TCustomWinSocket); 

var 

Buffer: PChar; 

begin 

Buffer := nil; 

while Socket.ReceiveLength > 0 do begin 

try 

Buffer := AllocMem(Socket.ReceiveLength); 

Socket.ReceiveBuf(Buffer^, Socket.ReceiveLength); 

Stream.Write(Buffer^, StrLen(Buffer)); 

finally 

FreeMem(Buffer); 

end; 

Stream.Seek(0, soFromBeginning); 

Stream.SaveToFile('c:\Temp\Weblog' + IntToStr(ServiceThread.ThreadID) + '.lo 

'); 

end; 

end; 

procedure TService1.Service1Execute(Sender: TService); 

begin 

Stream := TMemoryStream.Create; 

try 

ServerSocket1.Port := 80; // WWW port 

ServerSocket1.Active := True; 

while not Terminated do begin 

ServiceThread.ProcessRequests(False); 

end; 

ServerSocket1.Active := False; 

finally 

Stream.Free; 

end; 

end; 

end. 

 
 
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荣华富贵8

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值