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
    { Private declarations }
  public
    function GetServiceController: TServiceController; override;
    { Public declarations }
  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

user profile iconanubis2k5 hat folgendes geschrieben Zum zitierten Posting springen:
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!


jaenicke - So 08.05.11 19:01

user profile iconanubis2k5 hat folgendes geschrieben Zum zitierten Posting springen:
Auch auf die Gefahr hin, dass ich mich jetzt blamiere, aber wenn ich TEventLogger in der Hilfe als Suche angebe, erhalte ich nichts
Dann ist die Hilfe an der Stelle bei D2010 noch nicht vollständig. ;-) Bei XE reicht es F1 zu drücken oder zu suchen. ;-)

TEventLoggerXE

Dann empfehle ich dir die Onlineausgabe der Hilfe:
http://docwiki.embarcadero.com/VCL/de/Hauptseite
Das ist die, die auch mit den aktuellen Delphiversionen dann mitgeliefert wird.
Dort findest du dann auch das Stichwort:
http://docwiki.embarcadero.com/Search/?cx=017600442052825486983%3Adkcrzvfszgk&cof=FORID%3A9&ie=UTF-8&lr=lang_de&q=teventlogger&sa=Go&siteurl=docwiki.embarcadero.com%2FVCL%2Fde%2FHauptseite