{
Summary:
NT Service main unit
## $Id: servicemain.pas,v 1.3 2004/03/22 22:52:17 druid Exp $
}
unit servicemain;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs;
type
TServiceGrendel = class(TService)
procedure ServiceExecute(Sender: TService);
procedure ServiceStop(Sender: TService; var Stopped: Boolean);
procedure ServiceStart(Sender: TService; var Started: Boolean);
procedure ServiceAfterInstall(Sender: TService);
private
{ Private declarations }
procedure serverTick();
public
function GetServiceController: TServiceController; override;
{ Public declarations }
end;
var
ServiceGrendel: TServiceGrendel;
implementation
{$R *.DFM}
uses
Registry,
conns,
constants,
console,
server;
var
serverInstance : GServer;
procedure ServiceController(CtrlCode: DWord); stdcall;
begin
ServiceGrendel.Controller(CtrlCode);
end;
function TServiceGrendel.GetServiceController: TServiceController;
begin
Result := ServiceController;
end;
procedure TServiceGrendel.serverTick();
begin
ServiceThread.ProcessRequests(false);
end;
procedure TServiceGrendel.ServiceExecute(Sender: TService);
var
shutdownType : GServerShutdownTypes;
begin
writeConsole('Grendel ' + version_number + ' ready...');
shutdownType := serverInstance.gameLoop();
flushConnections();
serverInstance.cleanup();
serverInstance.Free();
Status := csStopped;
ReportStatus();
end;
procedure TServiceGrendel.ServiceStart(Sender: TService;
var Started: Boolean);
var
cons : GConsole;
path : string;
begin
Started := false;
path := ExtractFilePath(ParamStr(0));
if (not DirectoryExists(path)) then
begin
ErrCode := 1;
LogMessage('Directory "' + path + '" does not exist', EVENTLOG_ERROR_TYPE, 0, 1);
exit;
end;
ChDir(path);
cons := GConsole.Create();
cons.attachWriter(GConsoleLogWriter.Create('grendelservice'));
cons.Free();
serverInstance := GServer.Create();
serverInstance.OnTick := serverTick;
serverInstance.init();
writeConsole('Running as NT service...');
Started := true;
end;
procedure TServiceGrendel.ServiceStop(Sender : TService; var Stopped: Boolean);
begin
writeConsole('NT service halting...');
serverInstance.shutdown(SHUTDOWNTYPE_HALT, 0);
end;
procedure TServiceGrendel.ServiceAfterInstall(Sender: TService);
begin
with TRegistry.Create(KEY_READ or KEY_WRITE) do
try
RootKey := HKEY_LOCAL_MACHINE;
if OpenKey( 'SYSTEM\CurrentControlSet\Services\' + Name, True) then
begin
WriteString('Description', version_info + ' Version ' + version_number);
end;
finally
Free();
end;
end;
end.