Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Dienst Starten oder Beenden (https://www.delphipraxis.net/111525-dienst-starten-oder-beenden.html)

hedie 4. Apr 2008 18:02


Dienst Starten oder Beenden
 
Hallo

Weiss jemand wie ich einen Dienst starten oder beenden kann?

Vielen Dank schonmal....

toms 4. Apr 2008 18:14

Re: Dienst Starten oder Beenden
 
:arrow: Bei Google suchenDienst starten delphi

Dezipaitor 4. Apr 2008 18:47

Re: Dienst Starten oder Beenden
 
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;

gmc616 5. Apr 2008 03:51

Re: Dienst Starten oder Beenden
 
ShellExecuteEx mit Net Start bzw. Net Stop
mit TShellExecuteInfo.lpVerb := 'runas' um Admin-Rechte anzufordern, denn ein Jeder darf das ja nicht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:34 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz