Den Dienst über die Registry zu installieren ist nicht zu empfehlen. Die Struktur könnte sich schon beim nächsten Release ändern.
Ich verwende gerne das
VCL TService und daher habe ich folgendes gemacht:
TServiceApplication enthält schon installation und deinstallationscode, so dass man es nutzen sollte. Leider ist es nicht public.
Delphi-Quellcode:
TServiceApplicationEx = class(TServiceApplication)
public
procedure RegisterServices(Install, Silent: Boolean);
end;
{ TServiceApplicationEx }
procedure TServiceApplicationEx.RegisterServices(Install, Silent: Boolean);
begin
inherited;
end;
Starten kann man den Dienst vom Type TService dann mit dieser (angepassten) Toolfunktion.
Delphi-Quellcode:
uses JwaWindows;
procedure StartTheService(Service : TService);
var
hSCM: SC_HANDLE;
hSvc: SC_HANDLE;
args: array of PChar;
i : Integer;
begin
hSCM := OpenSCManager(nil, SERVICES_ACTIVE_DATABASEW, SC_MANAGER_CONNECT);
if hSCM = 0 then
RaiseLastOSError;
try
hSvc := OpenService(hSCM, PChar(Service.Name), SERVICE_START);
if hSvc = 0 then
RaiseLastOSError;
try
SetLength(args, ParamCount);
for i := 0 to ParamCount-1 do
begin
GetMem(args[i], Length(ParamStr(i+1))+2);
StringCchCopy(args[i], Length(ParamStr(i+1))+2, PChar(ParamStr(i+1)));
end;
try
if not StartServiceA(hSvc, Length(args), @args[0]) then
RaiseLastOSError;
finally
for i := 0 to ParamCount-1 do
begin
FreeMem(args[i]);
end;
end;
finally
CloseServiceHandle(hSvc);
end;
finally
CloseServiceHandle(hScm);
end;
end;
Man muss noch die Dienstanwendung etwas anpassen:
Delphi-Quellcode:
program xy;
begin
SvcMgr.Application.Free;
SvcMgr.Application := TServiceApplicationEx.Create(nil);
SvcMgr.Application.Initialize;
SvcMgr.Application.CreateForm(TMyService, MyService);
if xy then
StartService(MyService)
and exit here
else
SvcMgr.Application.Run;