![]() |
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:
Das funktioniert nicht:
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;
Delphi-Quellcode:
von einer Anmeldung bei der Datenbank ganz zu schweigen.
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; 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? |
AW: XE7 Dienst programmieren
Zitat:
Christoph |
AW: XE7 Dienst programmieren
er darf ja schreiben, aber nur mit ReWrite, das ist ja das komische. auch DBConnect (auskommentiert) bringt den gleichen Fehler
|
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. |
AW: XE7 Dienst programmieren
mach mal bei deiner DB-Verbingung ein try...except rum und logge die Exception-Meldung.
|
AW: XE7 Dienst programmieren
loggen geht ja nicht, kommt gleich obige Fehlermeldung
|
AW: XE7 Dienst programmieren
Zitat:
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. |
AW: XE7 Dienst programmieren
Ich würde das einfach ins Systemeventlog schreiben (TEventLogger aus Unit SvcMgr).
// EDIT: Zitat:
![]() |
AW: XE7 Dienst programmieren
Zitat:
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. |
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:
|
AW: XE7 Dienst programmieren
Zitat:
![]() 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: |
AW: XE7 Dienst programmieren
Zitat:
Zitat:
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:
|
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 16:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz