Einzelnen Beitrag anzeigen

Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#3

Re: Dienst Starten oder Beenden

  Alt 4. Apr 2008, 19:47
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;
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat