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