![]() |
bekomme den service nicht zum laufen...
Hallo
ich habe ein deprimierendes Problem. Ich nutze Delphi 2007 und Windows XP und habe meine Anwendung als in einer VLC-Anwendung fertig geschrieben und getestet. Es funktioniert alles! Natürlich habe ich darauf geachtet, dass über die VLC-Oberfläche keine Anwendereingaben gemacht werden und auch nicht ausgegeben wird! Der Input für die Anwendung ist ein ini-File und der Output mehrere txt-Dateien. Als alles gegangen ist, habe ich eine Service-Anwendung angelegt und meine Funktionalität in diese Service-Anwendung übertragen. Da passiert aber gar nichts, es wird keine Datei angelegt, nichts reingeschrieben, einfach gar nicht. Ich habe auch Interaktive auf true gesetzt und den Beispielcode von einem funktionierenden Beispielprogramm aus dem Internet reinkopiert, aber auch das geht bei mir nicht. Ich weiß mir nun nicht mehr zu helfen, weiß nicht, was ich noch testen kann :cry: Weiß wer von euch vielleicht einen Rat?! Lieben Gruß, sunshineh |
Re: bekomme den service nicht zum laufen...
mmh :glaskugel:
Hast Du den Service installiert? Ist er bei den Diensten aufgeführt und steht er dort als gestartet? Poste mal den Quelltext, so ohne weitere Info ist das doch ein bisserl zu sehr Glaskugel :wink: |
Re: bekomme den service nicht zum laufen...
Code steht hier:
![]() |
Re: bekomme den service nicht zum laufen...
Hallo,
muss das nicht
Delphi-Quellcode:
heißen?
ServiceThread.ProcessRequests(true);
|
Re: bekomme den service nicht zum laufen...
funktioniert mit true und mit false nicht
|
Re: bekomme den service nicht zum laufen...
Versuch's mal damit:
Delphi-Quellcode:
Die Stringliste gehört jetzt nicht mehr zur Klasse, sondern ist eine globale Variabel. Vermutlich ist das nicht sauber und nicht threadsicher. In meinen Services mach' ich das Logging so:
unit Unit1;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs; type TTestservice = class(TService) procedure ServiceStart(Sender: TService; var Started: Boolean); procedure ServiceExecute(Sender: TService); private { Private-Deklarationen } public function GetServiceController: TServiceController; override; { Public-Deklarationen } end; var Testservice: TTestservice; LogFile: TStringList; implementation {$R *.DFM} const LogFileName = 'c:\test\Service_log.txt'; procedure ServiceController(CtrlCode: DWord); stdcall; begin Testservice.Controller(CtrlCode); end; function TTestservice.GetServiceController: TServiceController; begin Result := ServiceController; end; procedure TTestservice.ServiceExecute(Sender: TService); begin while not Terminated do begin ServiceThread.ProcessRequests(true); // Sleep(5000); LogFile.Add(DateTimeToStr(Now)+' OnExecute'); LogFile.SaveToFile(LogFileName); end; end; procedure TTestservice.ServiceStart(Sender: TService; var Started: Boolean); begin LogFile.Add(DateTimeToStr(Now)+' Service gestartet'); LogFile.SaveToFile(LogFileName); end; initialization LogFile:=TStringList.Create; finalization LogFile.Free; end.
Delphi-Quellcode:
Wenn ein Service tagelang läuft und viel protokolliert, dürfte eine Stringliste auf Dauer zu einem Speicherfresser mutieren.
procedure TSystemmonitor.ErrorLog(sError : String; iDebugLevel : Integer);
Var f : TextFile; begin If iDebugLevel <= Self.DebugLevel Then Begin AssignFile(f,LogFileName); If FileExists(LogFileName) Then Append(f) Else ReWrite(f); WriteLn(f,DateToStr(Now) + ' ' + TimeToStr(Now) + ' ' + sError); CloseFile(f); End; end; procedure TSystemmonitor.ServiceStart(Sender: TService; var Started: Boolean); begin Self.ErrorLog('ServiceStart=' + IntToStr(Ord(Started)),1); end; |
Re: bekomme den service nicht zum laufen...
Funktioniert leider auch nicht :-(
Kann mir jemand ein kurzes funktionsfähiges Beispiel zur Verfügung stellen, in dem eine Log-Datei erzeugt wird?! Wäre wirklich sehr dankbar, weiß nicht, wo da der Wurm drin steckt! |
Re: bekomme den service nicht zum laufen...
Hallo,
mein Beispiel habe ich erst gepostet, nachdem es bei mir lief. |
Re: bekomme den service nicht zum laufen...
Das hatte ich befürchtet :-(
Ich habe nun nochmal ein neuen Dienst angelegt, die Bezeichnungen angepasst und deinen Code reinkopiert. Dazu habe ich Interaktiv auf "true" gesetzt und die exe ohne Fehlermeldung erstellt. Dann gehe ich wie folgt vor: 1.cmd 2.ich gehe in den Ordner C:\test und rufe die Projekt.exe /install auf -> ich erhalte die Meldung, das der Dienst erfolgreich installiert ist 3.ich klicke unter Verwaltung -> Dienste auf meinen Dienst Testservice und drücke auf Dienst starten. Das wird auch erfolgreich gemacht ich schaue in de n Ordner C:\test und da ist leider wieder keine txt Datei!!! :cry: Muss ich irgendwo Rechte vergeben, oder was mache ich falsch!!! Ich brauch dieses sch...Programm so dringend :( |
Re: bekomme den service nicht zum laufen...
liegt der Dienst auch unter c:\test?
mache mal vom cmd aus folgendes:
Code:
sieht das bei Dir genauso aus?
D:\Delphi7\Projects>project1 /install
D:\Delphi7\Projects>net start Testservice TestService wird gestartet. TestService wurde erfolgreich gestartet. D:\Delphi7\Projects>net stop Testservice TestService wird beendet... TestService wurde erfolgreich beendet. D:\Delphi7\Projects>project1 /uninstall D:\Delphi7\Projects> Die Ausgabedatei muss jetzt so aussehen:
Code:
Wenn es Rechte sein könnten:
23.10.2008 11:16:37 Service gestartet
23.10.2008 11:16:55 OnExecute Was für Rechte hast Du auf dem Rechner? Geh mal in die Systemsteuerung zu den Diensten und rufe die Eigenschaften des Dienstes auf. Dort gibt es den Reiter Anmelden. Gib' dort bei Dieses Konto ein Konto an, dass garantiert alle Rechte hat (also z. B. das lokale Adminkonto des Rechners). Dienst stoppen und Dienst starten, wenn's dann geht, ist es ein Rechteproblem. Wenn's nicht geht, poste bitte den Quelltext so, wie er jetzt ist, dann werd' ich es nochmal versuchen. Wenn irgendmöglich, verabschiede Dich bei der Protokollierung von der Stringliste. Schreibe jede Zeile mit WriteLn(f,'text') in die Logdatei. Du bekommst im Dienst einfach nicht mit, wenn bei der Arbeit mit der Stringliste eine Exception auftritt. Ich weiß nicht, wie ein Dienst intern abläuft und ob die Stringliste bei jedem Aufruf von ServiceExecute initialisiert ist, sprich, ob ein einmaliges Create für die gesamte Laufzeit des Dienstes ausreicht. Wenn nicht, kracht das hier mit ziemlicher Sicherheit und ServiceExecute wird mit 'ner Exception abgebrochen. Das bekommst Du von außen nicht mit. Versuch' die Protokollierung erstmal nur so (mit fest verdrahtetem Dateiname, die steht dann halt im Verzeichnis der Exe):
Delphi-Quellcode:
Auch wenn hier andauernd geprüft wird, ob eine Datei schon existiert und sie andauernd auf und zu gemacht wird. Zuerst muss 'ne Billigvariante laufen, bevor es auch was komplizierter werden darf.
AssignFile(f,'LogFileName');
If FileExists('LogFileName') Then Append(f) Else ReWrite(f); WriteLn(f,DateToStr(Now) + ' ' + TimeToStr(Now) + ' ' + 'Steht hier jetzt auch wirklich der Text in der Datei'); CloseFile(f); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:01 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