Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Windows Service Startet nicht (https://www.delphipraxis.net/201295-windows-service-startet-nicht.html)

Trafel21 9. Jul 2019 08:41

Windows Service Startet nicht
 
Hallo zusammen,

ich hab ein kleines Problem das mein Service nicht starten möchte. Es kommt die Fehlermeldung "Einige Dienste werden automatisch angehalten, wenn sie nicht von anderen Diensten oder Programmen verwendet werden.".

Ich hab ein TDatenModul aus AsteriskDataModul welche über SIP eine Schnittstelle die Telefonanlage überwacht. Welche beim Windows Start über einen Windows Service gehandelt werden soll. Ich bin ein kompletter Neuling was das Thema angeht. Weiß jemand wie ich ein DataModule in einem Service handel?

Mein Code sieht momentan wie folgt aus:

Code:
unit MyService;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.SvcMgr, Vcl.Dialogs, AsteriskDataModul;

type
  TTelephoneControl = class(TService)
    procedure ServiceAfterInstall(Sender: TService);
    procedure ServiceExecute(Sender: TService);
    procedure ServiceStart(Sender: TService; var Started: Boolean);
    procedure ServiceStop(Sender: TService; var Stopped: Boolean);
  private
    { Private-Deklarationen }
    AsteriskCallControlModule: Tbc_Asterisk_CallControl;
  public
    function GetServiceController: TServiceController; override;

    { Public-Deklarationen }
  end;

var
  TelephoneControl: TTelephoneControl; // ausAsteriskDataModul;

implementation

{$R *.dfm}

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
  TelephoneControl.Controller(CtrlCode);
end;

function TTelephoneControl.GetServiceController: TServiceController;
begin
  Result := ServiceController;
end;

procedure TTelephoneControl.ServiceAfterInstall(Sender: TService);
begin
//
end;

procedure TTelephoneControl.ServiceExecute(Sender: TService);
begin
//
end;

procedure TTelephoneControl.ServiceStart(Sender: TService; var Started: Boolean);
begin
  if not(assigned(AsteriskCallControlModule)) then
  begin
    AsteriskCallControlModule := Tbc_Asterisk_CallControl.Create(nil);
  end;
  Started := True;
end;

procedure TTelephoneControl.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
  FreeAndNil(AsteriskCallControlModule);
  Stopped := True;
end;

end.

DeddyH 9. Jul 2019 08:57

AW: Windows Service Startet nicht
 
Dein Service tut ja auch nichts. Schreib mal ins ServiceExecute:
Delphi-Quellcode:
  while not Terminated do
    ServiceThread.ProcessRequests(True);

Trafel21 9. Jul 2019 10:01

AW: Windows Service Startet nicht
 
Vielen Dank, funktioniert. :)

Ich hatte davor mittels TThread versucht ein Thread zu handeln.

Code:
unit MyService;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.SvcMgr, Vcl.Dialogs,
  AsteriskDataModul, Eventlog;
type
  TWorkflowThread = class(TThread)
  protected
    procedure Execute; override;
    var AsteriskCallControlModule: Tbc_Asterisk_CallControl;
  end;

  TBalyTelephoneControl = class(TService)
    procedure ServiceAfterInstall(Sender: TService);
    procedure ServiceExecute(Sender: TService);
    procedure ServiceStart(Sender: TService; var Started: Boolean);
    procedure ServiceStop(Sender: TService; var Stopped: Boolean);
    procedure ServiceShutdown(Sender: TService);
  private
    { Private-Deklarationen }
    fWorkflowThread: TWorkflowThread;
  public
    function GetServiceController: TServiceController; override;
    { Public-Deklarationen }
  end;

var
  BalyTelephoneControl: TBalyTelephoneControl;

implementation

{$R *.dfm}

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
  BalyTelephoneControl.Controller(CtrlCode);
end;

function TBalyTelephoneControl.GetServiceController: TServiceController;
begin
  Result := ServiceController;
end;

procedure TBalyTelephoneControl.ServiceAfterInstall(Sender: TService);
begin
  LogMessage('Afterinstall');
end;

procedure TBalyTelephoneControl.ServiceExecute(Sender: TService);
begin
  ServiceThread.ProcessRequests(true);
end;

procedure TBalyTelephoneControl.ServiceShutdown(Sender: TService);
begin
  if Assigned(fWorkflowThread) then
  begin
    fWorkflowThread.Terminate;
    while WaitForSingleObject(fWorkflowThread.Handle, WaitHint-100) = WAIT_TIMEOUT do
      ReportStatus;
    FreeAndNil(fWorkflowThread);
  end;
end;

procedure TBalyTelephoneControl.ServiceStart(Sender: TService; var Started: Boolean);
begin
  Eventlog.EventLog_Success('Service Start','Service Start','');
  fWorkflowThread := TWorkflowThread.Create(False);
  Started := True;
end;

procedure TBalyTelephoneControl.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
  Eventlog.EventLog_Success('Service Stop','Service Stop','');
  ServiceShutdown(Sender);
  Stopped := True;
end;

{ TWorkflowThread }

procedure TWorkflowThread.Execute;
begin
  inherited;
  try
    if not(assigned(AsteriskCallControlModule)) then
    begin
      AsteriskCallControlModule := Tbc_Asterisk_CallControl.Create(nil);
    end;
    while not Terminated do
    begin
      Sleep(500);
    end;
      FreeAndNil(AsteriskCallControlModule);
  except
    on e: Exception do Eventlog.EventLog_Error('Error',e.Message,'')
  end;
end;


end.
Muss ich nicht im ServiceThread mein Datamodul irgendwie einbinden?

Trafel21 9. Jul 2019 12:20

AW: Windows Service Startet nicht
 
Der Service funktioniert auf jedenfall und erfüllt seinen soll. Nochmal Danke für die Hilfe. ^^ Thread kann geschlossen werden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:05 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