Einzelnen Beitrag anzeigen

TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
608 Beiträge
 
Delphi 11 Alexandria
 
#1

Windows Dienst starten und beenden, interval

  Alt 6. Nov 2007, 15:07
Hallo,

ich habe anhand diverser Beiträge hier aus dem Forum mal einen eigenen Dienst/Service für Windows XP geschrieben,
soweit so gut klappt auch alles. Ich installiere den Dienst per Dienst.exe /install und starten tu ich im moment
noch per Verwaltung -> Dienste -> Rechts klick auf meinen Dienst -> starten.

Jetzt kommen 2 Fragen auf, wie starte ich den Dienst direkt weil beim installieren ist dieser ja noch nicht
gestartet ?! Ich bin am überlegen ein batch script oder programm im Autostart oder der gleichen zu hinterlegen
was mir meinen Dienst startet oder wenn möglich den Dienst direkt dort einfügen.

Das zweite Problem, gehe ich jetzt in die Dienstverwaltung und klicke auf Beenden erhalte ich eine Fehlermeldung,
das der Dienst nicht korrekt beendet werden konnte usw.

Hier mal der Quelltext zu meinem Dienst, der Dienst ist mit Turbo Delphi Explorer erstellt worden.
Delphi-Quellcode:
unit uMain;

interface

Const
  DelayTime = 5; //Zeitinterval in minuten
  DIR_MESSANZ = '\\server2\daten_public\daten\mess_anz\';
  FILE_LOG = 'D:\Source\Projekte\Dienst\service.log';
  MOD_Sys = 'Service';
  MOD_MessAnz = 'Mess_Anz';

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,
  DBXpress, WideStrings, DB, SqlExpr, uTools, MD5;

type
  TService1 = class(TService)
    SQLCon: TSQLConnection;
    procedure ServiceExecute(Sender: TService);
  private
    { Private-Deklarationen }
    procedure pUpdateMessAnz;
    procedure pLog(Modul, strMsg: String);
  public
    function GetServiceController: TServiceController; override;
    { Public-Deklarationen }
  end;

var
  Service1: TService1;

implementation


{$R *.DFM}





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





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





procedure TService1.ServiceExecute(Sender: TService);
begin
  While NOT Terminated Do Begin
    ServiceThread.ProcessRequests(False);

    //Datenbank verbindung öffnen
    If NOT SQLCon.Connected Then Begin
      Try
        SQLCon.Open;
      Except
        On E: Exception Do Begin
          pLog(MOD_Sys, 'Fehler beim Verbinden mit der Datenbank!');
          pLog(MOD_Sys, E.Message);
        End;
      End;
    End;

    //Update Routinen ausführen...
    If SQLCon.Connected Then Begin
      pLog(MOD_Sys, 'Beginne Update');

      pUpdateMessAnz;
    End;{if}

    //Verbindung beenden falls noch offen...
    If SQLCon.Connected Then SQLCon.Close;

    //Service schlafen legen ...
    Sleep(1000 * 60 * DelayTime);
  End;{while}

end;





procedure TService1.pUpdateMessAnz;
begin
  //mySQL Datenbank update...
end;





procedure TService1.pLog(Modul, strMsg: string);
var
  FHandle : Text;

begin
  System.Assign(FHandle, FILE_LOG);
  {$I-}
  If FileExists(FILE_LOG) Then
    Append(FHandle)
  Else
    Rewrite(FHandle);
  {$I+}
  If IoResult = 0 Then Begin
    Writeln(FHandle, DateTimeToStr(Now)+' '+Modul+': '+strMsg);
    System.Close(FHandle);
  End;{if}

end;





end.
Was der Dienst einfach machen soll ist alle paar Minuten alle Dateien aus einem Verzeichnis prüfen ob deren Inhalt
in einer Datenbank eingetragen ist. Mir scheint es da ein Problem mit der Sleep() Anweisung zu geben jedoch wüßte
ich grade keine alternative wie ich es schaffe das der Dienst nur alle paar minuten prüft und nicht in einem durch.

mfg

TUX
  Mit Zitat antworten Zitat