Entwickler-Ecke
Sonstiges (Delphi) - Windows Dienst startet nicht - was mache ich falsch?
anubis2k5 - Sa 07.05.11 19:27
Titel: Windows Dienst startet nicht - was mache ich falsch?
Hallo Leute
ich versuche derzeit einen simplen Windowsdienst zu entwickeln, leider scheidere ich schon bei der Vorlage von Delphi (2010).
Das kompilieren funktioniert ohne Probleme, auch das starten per xxx.exe /install funktioniert. Das Ereignis von ServiceCreate wird auch noch ausgeführt doch dann ist Ruhe...
Versuche ich den Dienst mittels: "net start test_srv.exe" zu starten, passiert gar nichts - bis auf die Fehlermeldung das der Dienst nicht reagiert (siehe
Screenshot Konsole (jpg, 82.3 KB)).
Hier der Code:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53:
| unit test_srv_unit1;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs;
type TService1 = class(TService) procedure ServiceCreate(Sender: TObject); procedure ServiceExecute(Sender: TService); procedure ServiceStart(Sender: TService; var Started: Boolean); private public function GetServiceController: TServiceController; override; end;
var Service1: TService1;
implementation
{$R *.DFM}
procedure ServiceController(CtrlCode: DWord); stdcall; begin Service1.Controller(CtrlCode); ShowMessage(IntToStr(CtrlCode)); end;
function TService1.GetServiceController: TServiceController; begin Result := ServiceController; end;
procedure TService1.ServiceCreate(Sender: TObject); begin ShowMessage('Create'); end;
procedure TService1.ServiceExecute(Sender: TService); begin ShowMessage('Execute'); end;
procedure TService1.ServiceStart(Sender: TService; var Started: Boolean); begin ShowMessage('Start'); end;
end. |
Delete - Sa 07.05.11 20:44
Beschäftige dich mal mit den Grundlagen von Diensten. Wenn dein Dienst kein Interaktiverdienst ist, und die gibt es ab Vista nicht mehr, dürftest du keine Nachricht zu sehen bekommen, weil der Dienst in einer anderen Windowsstation auf einem anderen Desktop läuft und keinen Zugriff auf den Desktop des interaktiv angemeldeten Benutzers hat.
anubis2k5 - Sa 07.05.11 20:49
Oh ha, das war mir wirklich neu... Danke dir Michael.
Kannst du mir schnell mit einem Link auf dein Tutorial zu den Diensten helfen?
Halt! Habe gerade mal mein Projekt überprüft, das Häkchen ist aber bei Interactive drin?!
jaenicke - Sa 07.05.11 21:18
anubis2k5 hat folgendes geschrieben : |
| Halt! Habe gerade mal mein Projekt überprüft, das Häkchen ist aber bei Interactive drin?! |
Wie schon geschrieben:
Die gibt es ab Vista gar nicht mehr und waren vorher auch nur eine Notlösung, wenn man kein sauberes Konzept entwickeln wollte.
Benutze einfach das Eventlog, wenn du Logausgaben machen willst. Dafür ist es da. Und dafür gibt es schon fertige Klasse für den Zugriff in Delphi.
// EDIT:
Beispiel:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| const SERVER_DISCONNECT = 3331;
procedure TMyDataModule.WebModuleCreate(Sender: TObject); begin FEventLogger := TEventLogger.Create(ExtractFileName(ParamStr(0))); end;
procedure TMyDataModule.WebModuleDestroy(Sender: TObject); begin FreeAndNil(FEventLogger); end;
FEventLogger.LogMessage('Server stopped listening!', EVENTLOG_INFORMATION_TYPE, 1, SERVER_DISCONNECT); |
anubis2k5 - So 08.05.11 09:36
Ich danke euch!
nach entfernen aller "ShowMessages" und der Unit Dialogs funktionierte der Dienst wie gewünscht.
Startet der Dienst eigentlich bei jedem Systemstart, wenn ich diesen einmalig mittels "net start dienst" aktiviert habe?
Grüße Thomas
jaenicke - So 08.05.11 11:57
In der Standardeinstellung steht der Dienst auf Starttyp automatisch. Das kannst du im Dienstmodul in Delphi einfach im Objektinspektor einstellen. ;-)
Deshalb musst du ihn nicht einmal manuell starten nach der Installation, ein Neustart des Rechners reicht auch.
anubis2k5 - So 08.05.11 13:22
Eine kurze Frage noch - erläutere mir bitte kurz, wo ich die Klasse zum Eventlog finde - durch die Hilfe konnte ich nichts finden...
Delete - So 08.05.11 13:49
Ist in der Service Klasse enthalten: SvcMgr. Aber das sollte man auch über die Hilfe herausfinden können.
jaenicke - So 08.05.11 13:57
Richtig, F1 auf TEventLogger führt mich direkt zu der entsprechenden Seite.
Abgesehen davon ist die Unit in einer Service-Anwendung ohnehin schon drin, sonst würde das ganze gar nicht funktionieren. :gruebel: Und oben im geposteten Quelltext ist die ja auch schon drin. :nixweiss:
anubis2k5 - So 08.05.11 18:34
Auch auf die Gefahr hin, dass ich mich jetzt blamiere, aber wenn ich TEventLogger in der Hilfe als Suche angebe, erhalte ich nichts - erst mit LogMessage stoße ich auf TEventLogger :(
Egal, danke trotzdem für eure Hilfe!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!