Delphi 編寫Windows NT服務(wù)
發(fā)表時間:2023-04-07 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]1.產(chǎn)生一個Win32服務(wù)應(yīng)用 產(chǎn)生一個Win32服務(wù)應(yīng)用,選擇File New菜單,在New Items頁中選擇Service Application。這樣在你的工程里加入一個全局變量命名的應(yīng)用...
1.產(chǎn)生一個Win32服務(wù)應(yīng)用
產(chǎn)生一個Win32服務(wù)應(yīng)用,選擇File New菜單,在New Items頁中選擇Service Application。這樣在你的工程里加入一個全局變量命名的應(yīng)用,它是 TserviceApplication類型。每個服務(wù)工程自動的聲明一個TServiceApplication 實例,并不需要直接的對它編程。另外自動產(chǎn)生一個TService對象。
當(dāng)你產(chǎn)生一個服務(wù)應(yīng)用,你會在設(shè)計環(huán)境中看到一個窗口,它對應(yīng)了一個服務(wù) (Tservice)。在Object Inspector中設(shè)置它的屬性和事件以實現(xiàn)它。在你的服務(wù)應(yīng)用中可以加入其他的服務(wù)。不要將Service加入在一個非Service Application中。當(dāng)加入一個TService對象時,因為服務(wù),應(yīng)用將不產(chǎn)生事件請求和使用合適的窗口調(diào)用。
2.TServiceApplication
TServiceApplication封裝了windows NT Service Application。它提供服務(wù)應(yīng)用的基本行為框架。它包含TService對象,每個Tservice封裝了一個NT服務(wù)。服務(wù)應(yīng)用提供服務(wù)產(chǎn)生、安裝、注冊、分發(fā)和卸載的方法。
注意,不要在工程的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,端口設(shè)為80,這個例子將在c:\temp目錄下產(chǎn)生一個文本文件,名字為WebLogxxx.log(xxx是線程IDThreadID)?催\行結(jié)果:啟動程序,打開一個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.