中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Delphi > 综合文章
Delphi 编写Windows NT服务
作者:未知 时间:2005-08-07 20:59 出处:编程爱好者网站 责编:chinaitpower
              摘要: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.

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有