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