![]() |
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:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:34 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