Autor Beitrag
anubis2k5
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23

Windows 7
Delphi 2010
BeitragVerfasst: Sa 07.05.11 19:27 
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:
ausblenden volle Höhe 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.
Einloggen, um Attachments anzusehen!
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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.

Für diesen Beitrag haben gedankt: anubis2k5
anubis2k5 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23

Windows 7
Delphi 2010
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19335
Erhaltene Danke: 1751

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23

Windows 7
Delphi 2010
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19335
Erhaltene Danke: 1751

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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.

Für diesen Beitrag haben gedankt: anubis2k5
anubis2k5 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23

Windows 7
Delphi 2010
BeitragVerfasst: 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...
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19335
Erhaltene Danke: 1751

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23

Windows 7
Delphi 2010
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19335
Erhaltene Danke: 1751

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:
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:
docwiki.embarcadero....CL%2Fde%2FHauptseite
Einloggen, um Attachments anzusehen!

Für diesen Beitrag haben gedankt: anubis2k5