Entwickler-Ecke

Windows API - Service.Execute wird nicht ausgeführt


Jakane - Mo 15.12.14 15:16
Titel: Service.Execute wird nicht ausgeführt
Hallo liebe Delphi-Helfer :)


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:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
unit Haupt;

interface

uses
  System.SysUtils, System.Classes,
  Vcl.Graphics, Vcl.Controls, Vcl.SvcMgr, Vcl.Dialogs,
  Winapi.Windows, Winapi.Messages;

type
  TSHaupt = class(TService)
    procedure ServiceAfterInstall(Sender: TService);
    procedure ServiceAfterUninstall(Sender: TService);
    procedure ServiceBeforeInstall(Sender: TService);
    procedure ServiceBeforeUninstall(Sender: TService);
    procedure ServiceContinue(Sender: TService; var Continued: Boolean);
    procedure ServiceExecute(Sender: TService);
    procedure ServicePause(Sender: TService; var Paused: Boolean);
    procedure ServiceShutdown(Sender: TService);
    procedure ServiceStart(Sender: TService; var Started: Boolean);
    procedure ServiceStop(Sender: TService; var Stopped: Boolean);
  private
    { Private-Deklarationen }
    procedure Listeneintrag(psText: String);
  public
    function GetServiceController: TServiceController; override;
    { Public-Deklarationen }
  end;

var
  SHaupt: TSHaupt;

implementation

{$R *.DFM}

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
  SHaupt.Controller(CtrlCode);
end;

function TSHaupt.GetServiceController: TServiceController;
begin
  Result := ServiceController;
end;

procedure TSHaupt.ServiceAfterInstall(Sender: TService);
begin
  Listeneintrag('ServiceAfterInstall');
end;

procedure TSHaupt.ServiceAfterUninstall(Sender: TService);
begin
  Listeneintrag('ServiceAfterUninstall');
end;

procedure TSHaupt.ServiceBeforeInstall(Sender: TService);
begin
  Listeneintrag('ServiceBeforeInstall');
end;

procedure TSHaupt.ServiceBeforeUninstall(Sender: TService);
begin
  Listeneintrag('ServiceBeforeUninstall');
end;

procedure TSHaupt.ServiceContinue(Sender: TService; var Continued: Boolean);
begin
  Listeneintrag('OnContinue');
  Continued := True;
end;

procedure TSHaupt.ServiceExecute(Sender: TService);
begin
  Listeneintrag('OnExecute - begin');
  while not Terminated do
  begin
    ServiceThread.ProcessRequests(False);
  end;
  Listeneintrag('OnExecute - end');
end;

procedure TSHaupt.ServicePause(Sender: TService; var Paused: Boolean);
begin
  Listeneintrag('OnPause');
  Paused := True;
end;

procedure TSHaupt.ServiceShutdown(Sender: TService);
begin
  Listeneintrag('OnShutdown');
end;

procedure TSHaupt.ServiceStart(Sender: TService; var Started: Boolean);
begin
  Listeneintrag('OnStart');
  Started := True;
end;

procedure TSHaupt.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
  Listeneintrag('OnStop');
  Stopped := True;
end;

procedure TSHaupt.Listeneintrag(psText: String);
var
  Liste : TStringList;
begin
  Liste := TStringList.Create;
  Liste.LoadFromFile('C:\Jakane\FÜDienst\Dienstbuch.log');
  Liste.Add(FormatDateTime('dd.mm.yy hh:nn:ss:zzz ', Now) + psText);
  Liste.SaveToFile('C:\Jakane\FÜDienst\Dienstbuch.log');
end;

end.


Nach dem Starten und Beenden der Services steht folgendes im Log:
15.12.14 14:13:03:408 ServiceBeforeInstall
15.12.14 14:13:03:440 ServiceAfterInstall
15.12.14 14:13:09:548 ServiceBeforeUninstall
15.12.14 14:13:09:552 ServiceAfterUninstall

Weiss einer wieso der mir speziell ServiceExecute und die anderen nicht ausführt?

Danke für evtl. Mühen :)


Nersgatt - Mo 15.12.14 15:48

Hast Du die Ereignisse im Objektinspektor auch des Services auch drin stehen? Oder nur so in den Quellcode geschrieben?

Nebenbei (hat mit dem Problem nichts zu tun): Deine Procedure "Listeneintrag" hat ein Speicherleck. Besser so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
var
  Liste : TStringList;
begin
  Liste := TStringList.Create;
  try
    Liste.LoadFromFile('C:\Jakane\FÜDienst\Dienstbuch.log');
    Liste.Add(FormatDateTime('dd.mm.yy hh:nn:ss:zzz ', Now) + psText);
    Liste.SaveToFile('C:\Jakane\FÜDienst\Dienstbuch.log');
  finally
    Liste.free;
  end;
end;


baumina - Mo 15.12.14 15:51

Einen Service installieren bzw. zu deinstallieren hat nichts mit den Ausführen zu tun. Nachdem du einen Service installiert hast, musst du ihn über die Windowsdienste auch starten.


Jakane - Mi 17.12.14 14:34

Soviel eigene Blödheit sollte bestaft werden :oops: :lol: :lol: