Delphi-PRAXiS

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

himitsu 1. Okt 2014 16:52

AW: XE7 Dienst programmieren
 
Zitat:

Bei einer Textdatei ist F nach dem Öffnen schreibgeschützt.
Delphi-Referenz durchsuchenAppend?

Das würde natürlich bedeuten es knallt nicht beim Reset, sondern beim WriteLn ... es wäre toll, wenn Leute den Debuggen kennen/benutzen würden und eine richtige Fehlerbehandlung einbauen täten. :stupid:

jensw_2000 1. Okt 2014 17:02

AW: XE7 Dienst programmieren
 
Zitat:

Zitat von ol1uw (Beitrag 1274453)

Zitat:

Bei einer Textdatei ist F nach dem Öffnen schreibgeschützt.
Ich glaube das bezieht sich nur auf das Filehandle "F" und nicht auf die geöffnete Textdatei selbst.
Der zuvor festzulegende "FileMode" bestimmt, ob die Datei lesend oder schreibbar geöffnet wird. Standard ist "Read/Write".

Das hier kommt bei Reset(f) vermutlich eher zum Tragen:
Zitat:

Zitat von http://docwiki.embarcadero.com/Libraries/XE7/de/System.Reset
Ist keine Datei mit diesem Namen vorhanden oder kann die Datei nicht im aktuellen Dateimodus geöffnet werden, tritt ein Fehler auf.

Zitat:

Zitat von himitsu (Beitrag 1274454)
es wäre toll, wenn Leute den Debuggen kennen/benutzen würden und eine richtige Fehlerbehandlung einbauen täten.

:thumb:

AlBo55 1. Okt 2014 19:21

AW: XE7 Dienst programmieren
 
das war ja einfach.
rewrite löst den Fehler "Dateizugriff verweigert" aus ( wird im Dienst nicht angezeigt), schreibt aber trotzdem (d.h. Datei auf C:\ vorhanden).
mit c:\programdata läuft alles bestens und ich kann weiter üben.

ich war natürlich als Admin angemeldet, als ich den Dienst gestartet habe. augenscheinlich muss man dem Dienst selber aber extra weiterreichende Rechte verpassen

allen vielen Dank für die Hilfe und die Spekulationen


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