[b]unit[/b] mainsvc;
[b]interface[/b]
[b]uses[/b]
Winapi.Windows, System.SysUtils, Vcl.SvcMgr, ADODB;
[b]type[/b]
TLogic = [b]class[/b]
[b]private[/b]
FConnection: TADOConnection;
[b]public[/b]
[b]constructor[/b] Create;
[b]destructor[/b] Destroy; [b]override[/b];
[b]procedure[/b] Initialise;
[b]end[/b];
TServiceMate = [b]class[/b]
[b]private[/b]
FAppLogic: TLogic;
FDescription: [b]String[/b];
[b]procedure[/b] ServiceStart(Sender: TService; [b]var[/b] Started: Boolean);
[b]procedure[/b] ServiceStop(Sender: TService; [b]var[/b] Stopped: Boolean);
[b]public[/b]
[b]constructor[/b] Create(AService: TService; ADescription: [b]String[/b]);
[b]destructor[/b] Destroy; [b]override[/b];
[b]property[/b] AppLogic: TLogic [b]read[/b] FAppLogic [b]write[/b] FAppLogic;
[b]end[/b];
TService1 = [b]class[/b](TService)
[b]procedure[/b] ServiceCreate(Sender: TObject);
[b]procedure[/b] ServiceDestroy(Sender: TObject);
[b]procedure[/b] ServiceStart(Sender: TService; [b]var[/b] Started: Boolean);
[b]procedure[/b] ServiceStop(Sender: TService; [b]var[/b] Stopped: Boolean);
[b]procedure[/b] ServiceExecute(Sender: TService);
[b]private[/b]
FLogic: TLogic;
FSvcMate: TServiceMate;
[b]public[/b]
[b]function[/b] GetServiceController: TServiceController; [b]override[/b];
[navy]{ Public declarations }[/navy]
[b]end[/b];
[b]procedure[/b] Log(AMessage: [b]String[/b]);
[b]var[/b]
Service1: TService1;
[b]implementation[/b]
[b]uses[/b]
ActiveX;
[b]const[/b]
ForceFault = True;
[b]var[/b]
GLogFile: [b]String[/b];
[navy]{$R *.DFM}[/navy]
[b]procedure[/b] Log(AMessage: [b]String[/b]);
[b]var[/b]
t : TextFile;
[b]begin[/b]
AssignFile(t, GLogFile);
[b]if[/b] FileExists(GLogFile) [b]then[/b]
Append(t)
[b]else[/b]
Rewrite(t);
[b]try[/b]
WriteLn(t, DateTimeToStr(Now) + [teal]': '[/teal] + AMessage);
[b]finally[/b]
CloseFile(t);
[b]end[/b];
[b]end[/b];
[b]procedure[/b] ServiceController(CtrlCode: DWord); stdcall;
[b]begin[/b]
Service1.Controller(CtrlCode);
[b]end[/b];
[b]function[/b] TService1.GetServiceController: TServiceController;
[b]begin[/b]
Result := ServiceController;
[b]end[/b];
[b]procedure[/b] TService1.ServiceCreate(Sender: TObject);
[b]begin[/b]
GLogFile := ChangeFileExt(ParamStr([purple]0[/purple]), [teal]'.log'[/teal]);
DeleteFile(GLogFile);
[b]if[/b] ForceFault [b]then[/b]
[b]begin[/b]
FSvcMate := TServiceMate.Create(Self, [teal]'Test CoInitialise service'[/teal]);
FSvcMate.AppLogic := TLogic.Create;
[b]end[/b];
[b]end[/b];
[b]procedure[/b] TService1.ServiceDestroy(Sender: TObject);
[b]begin[/b]
FSvcMate.Free;
[b]end[/b];
[b]procedure[/b] TService1.ServiceExecute(Sender: TService);
[b]begin[/b]
Log([teal]'ServiceExecute entered'[/teal]);
[b]with[/b] Sender [b]do[/b]
[b]while[/b] [b]not[/b] Terminated [b]do[/b]
ServiceThread.ProcessRequests(True);
[b]end[/b];
[b]procedure[/b] TService1.ServiceStart(Sender: TService; [b]var[/b] Started: Boolean);
[b]begin[/b]
FLogic := TLogic.Create;
FLogic.Initialise;
[b]end[/b];
[b]procedure[/b] TService1.ServiceStop(Sender: TService; [b]var[/b] Stopped: Boolean);
[b]begin[/b]
FLogic.Free;
[b]end[/b];
[navy]{ TLogic }[/navy]
[b]constructor[/b] TLogic.Create;
[b]begin[/b]
[b]inherited[/b];
[b]case[/b] CoInitialize([b]nil[/b]) [b]of[/b]
E_INVALIDARG : Log([teal]'CoInitialize failed: E_INVALIDARG'[/teal]);
E_OUTOFMEMORY: Log([teal]'CoInitialize failed: E_OUTOFMEMORY'[/teal]);
E_UNEXPECTED: Log([teal]'CoInitialize failed: E_UNEXPECTED'[/teal]);
S_OK: Log([teal]'CoInitialize completed successfully'[/teal]);
S_FALSE: Log([teal]'CoInitialize already called'[/teal]);
RPC_E_CHANGED_MODE: Log([teal]'CoInitialize already called with different concurrency model'[/teal]);
[b]else[/b]
Log([teal]'Unknown response from CoInitialize'[/teal]);
[b]end[/b];
FConnection := TADOConnection.Create([b]nil[/b]);
[b]end[/b];
[b]destructor[/b] TLogic.Destroy;
[b]begin[/b]
FConnection.Free;
CoUninitialize;
[b]inherited[/b];
[b]end[/b];
[b]procedure[/b] TLogic.Initialise;
[b]const[/b]
DBName = [teal]'c:\test.mdb'[/teal];
[b]begin[/b]
FConnection.ConnectionString := [teal]'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='[/teal]
+ DBName + [teal]';Persist Security Info=False;'[/teal];
FConnection.LoginPrompt := False;
[b]try[/b]
Log([teal]'About to connect to DB'[/teal]);
FConnection.Open;
Log([teal]'Connected ok'[/teal]);
[b]except[/b]
[b]on[/b] E: Exception [b]do[/b]
[b]begin[/b]
Log(Format([teal]'(%s) %s'[/teal], [E.ClassName, E.Message]));
[b]raise[/b];
[b]end[/b];
[b]end[/b];
[b]end[/b];
[navy]{ TServiceMate }[/navy]
[b]constructor[/b] TServiceMate.Create(AService: TService; ADescription: [b]String[/b]);
[b]begin[/b]
Log([teal]'ServiceMate.Create entered'[/teal]);
[b]inherited[/b] Create;
Log([teal]'ServiceMate.Create inherited'[/teal]);
FDescription := ADescription;
[b]if[/b] Assigned(AService) [b]then[/b]
[b]begin[/b]
AService.OnStart := ServiceStart;
AService.OnStop := ServiceStop;
Log([teal]'ServiceMate.Create adding service'[/teal]);
[b]end[/b];
FAppLogic := [b]nil[/b];
Log([teal]'ServiceMate.Create complete'[/teal]);
[b]end[/b];
[b]destructor[/b] TServiceMate.Destroy;
[b]begin[/b]
FreeAndNil(FAppLogic);
[b]inherited[/b];
[b]end[/b];
[b]procedure[/b] TServiceMate.ServiceStart(Sender: TService; [b]var[/b] Started: Boolean);
[b]begin[/b]
Log([teal]'ServiceMate.ServiceStart entered'[/teal]);
[b]if[/b] Assigned(FAppLogic) [b]then[/b]
[b]try[/b]
Log([teal]'Initialising logic'[/teal]);
FAppLogic.Initialise;
Log([teal]'Service started'[/teal]);
Started := True;
[b]except[/b]
[b]on[/b] E: Exception [b]do[/b]
[b]begin[/b]
Log(Format([teal]'(%s) %s'[/teal], [E.ClassName, E.Message]));
Started := False;
[b]end[/b];
[b]end[/b];
[b]end[/b];
[b]procedure[/b] TServiceMate.ServiceStop(Sender: TService; [b]var[/b] Stopped: Boolean);
[b]begin[/b]
[b]end[/b];
[b]end[/b].