⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 delphi 编写windows nt服务 (2000年11月6日).txt

📁 自己对DELPHI学习的一点体会
💻 TXT
字号:
Delphi 编写Windows NT服务 (2000年11月6日) 

本站更新  分类:   作者:逸仙时空  推荐:   阅读次数:673  
(http://www.codesky.net)  

--------------------------------------------------------------------------------
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. 

 
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -