Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   XE7 Dienst programmieren (https://www.delphipraxis.net/182106-xe7-dienst-programmieren.html)

AlBo55 1. Okt 2014 12:56

XE7 Dienst programmieren
 
Hallo,
da wollte ich mal einen Dienst programmieren und schon bin ich der Verzeiflung nahe.

ich hab einfach eine Service-Anwendung erstellt.

Das funktioniert:
Delphi-Quellcode:
procedure TService1.ServiceStart(Sender: TService; var Started: Boolean);
begin
  AssignFile(f, 'C:\testdatei.txt');
  Rewrite(f);
  WriteLn(f,DatetimeToStr(now)+': Hallo, jemand da?');
  CloseFile(f);
//  DB_airport.Params.Values['Server'] := '192.168.178.45';
//  DB_airport.Params.Values['Port'] := '3051';
//  DB_airport.Params.Values['DataBase'] := 'Test';
//  DB_Airport.Connected:=True;
  AssignFile(f, 'C:\testdatei.txt');
  Rewrite(f); // <=======
  WriteLn(f,DatetimeToStr(now)+': Datenbank verbunden');
  CloseFile(f);
end;
Das funktioniert nicht:
Delphi-Quellcode:
procedure TService1.ServiceStart(Sender: TService; var Started: Boolean);
begin
  AssignFile(f, 'C:\testdatei.txt');
  Rewrite(f);
  WriteLn(f,DatetimeToStr(now)+': Hallo, jemand da?');
  CloseFile(f);
//  DB_airport.Params.Values['Server'] := '192.168.178.45';
//  DB_airport.Params.Values['Port'] := '3051';
//  DB_airport.Params.Values['DataBase'] := 'Test';
//  DB_Airport.Connected:=True;
  AssignFile(f, 'C:\testdatei.txt');
  Reset(f); //<============
  WriteLn(f,DatetimeToStr(now)+': Datenbank verbunden');
  CloseFile(f);
end;
von einer Anmeldung bei der Datenbank ganz zu schweigen.

Fehlermeldung: Dienst "Service1" wurde auf "lokaler Computer" gestartet und dann angehalten. Einige Dienste werden automatisch angehalten, wenn sie nicht von anderen Diensten oder Programmen verwendet werden.

Hat jemand dazu eine Idee?

pertzschc 1. Okt 2014 13:01

AW: XE7 Dienst programmieren
 
Zitat:

Zitat von AlBo55 (Beitrag 1274422)
Hat jemand dazu eine Idee?

Der Benutzer, unter dem Dein Dienst ausgeführt wird, darf nicht auf "C:\" schreiben?
Christoph

AlBo55 1. Okt 2014 13:07

AW: XE7 Dienst programmieren
 
er darf ja schreiben, aber nur mit ReWrite, das ist ja das komische. auch DBConnect (auskommentiert) bringt den gleichen Fehler

jensw_2000 1. Okt 2014 13:10

AW: XE7 Dienst programmieren
 
Alles richtig soweit. Dein Dienst macht genau Das, was Du programmiert hast:
Im Start Event schnell versuchen eine Dateiausgabe zu machen bevor der ServiceThread sofort beendet wird.

Schau Dir mal ein paar TService Tutorials an. Du wirst schnell sehen, wie man TService Start, Stop, Execute, Pause und Continue richtig implementiert.

Der Netzwerkzugriff auf die DB aus dem lokalem Systemkontext heraus muss auch nicht klappen. Dafür nimmt man den "Netzwerkdienst" oder besser ein eigenes Dienstkonto mit expliziten Berechtgungen.

Bernhard Geyer 1. Okt 2014 14:18

AW: XE7 Dienst programmieren
 
mach mal bei deiner DB-Verbingung ein try...except rum und logge die Exception-Meldung.

AlBo55 1. Okt 2014 15:07

AW: XE7 Dienst programmieren
 
loggen geht ja nicht, kommt gleich obige Fehlermeldung

jensw_2000 1. Okt 2014 16:12

AW: XE7 Dienst programmieren
 
Zitat:

Zitat von AlBo55 (Beitrag 1274434)
loggen geht ja nicht, kommt gleich obige Fehlermeldung

Das ist KEINE Fehlermeldung, sondern ein Hinweis, dass Dein Service den ServiceThread sofort nach dem Start EIGENSTÄNDIG beendet hat.

Es gibt 2 Varianten.
a) Dein Code in ServiceStart verursacht eine Exception und schießt den ServiceThread damit ab.
b) Du hast ServiceExecute nicht (richtig) implementiert. Wie das richtig geht (while not Terminated do begin... end) steht in hunderten Tutorials.

jaenicke 1. Okt 2014 16:14

AW: XE7 Dienst programmieren
 
Ich würde das einfach ins Systemeventlog schreiben (TEventLogger aus Unit SvcMgr).

// EDIT:
Zitat:

Zitat von jensw_2000 (Beitrag 1274439)
b) Du hast ServiceExecute nicht (richtig) implementiert. Wie das richtig geht (while not Terminated do begin... end) steht in hunderten Tutorials.

Wobei das nicht so nötig ist. Es geht auch anders, siehe z.B. hier:
http://www.tolderlund.eu/delphi/service/service.htm

jensw_2000 1. Okt 2014 16:30

AW: XE7 Dienst programmieren
 
Zitat:

Zitat von jaenicke (Beitrag 1274440)
Wobei das nicht so nötig ist. Es geht auch anders, siehe z.B. hier:
http://www.tolderlund.eu/delphi/service/service.htm

Beim überfliegen habe ich dort eben nur 2 Varianten gesehen.
a) "ServiceExecute" hält den Service mit "while not terminated do begin machwas; end;" am Leben
b) die sauberere, aber für den Beginn kompliziertere Variante, mit dem "inneren" ServiceThread

Bevor er sich an Variante "B" wagt sollte "A" aus meiner Sicht erstmal gelingen.

ol1uw 1. Okt 2014 16:49

AW: XE7 Dienst programmieren
 
mal abgesehen von denn anderen angesprochenen Sachen

Delphi-Quellcode:
  AssignFile(f, 'C:\testdatei.txt');
  Reset(f); //<============ siehe http://docwiki.embarcadero.com/Libraries/XE7/de/System.Reset
  WriteLn(f,DatetimeToStr(now)+': Datenbank verbunden');
  CloseFile(f);
end;
Zitat:

Bei einer Textdatei ist F nach dem Öffnen schreibgeschützt.
Uwe


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:44 Uhr.
Seite 1 von 2  1 2      

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