Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Anwendung wahlweise als Service oder Formular


Nersgatt - Mo 21.10.13 11:43
Titel: Anwendung wahlweise als Service oder Formular
Moin,

ich arbeite grade an einem Service.
Ich möchte diesen Service aber wahlweise als normale Anwendung starten (vor alles zur Fehlersuche). Die Logik liegt in einem Datenmodul, das nur erzeugt und initialisiert werden muss. Ob das Datenmodul nun von einem TService oder einem TForm initialisiert wird ist egal.

Nun hab ich mir den Projektquelltext angepasst, dass ich wahlweise ein MainForm erstelle, oder halt den TService:


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:
program AAServer;

uses
  Vcl.SvcMgr,
  Vcl.Forms,
  UsrvMain in 'UsrvMain.pas',
  UServiceTools in 'UServiceTools.pas',
  UdmSrvMain in 'UdmSrvMain.pas',
  UfrmMain in 'UfrmMain.pas' {frmMain},
  UParam in 'UParam.pas';

{$R *.RES}

var
  par : TCmdLineParams;

begin

  par := TCmdLineParams.Create;
  try
    if par.StartAsApplication then
    begin
      Vcl.Forms.Application.Initialize;
      Vcl.Forms.Application.MainFormOnTaskbar := True;
      Vcl.Forms.Application.CreateForm(TfrmMain, frmMain);
      Vcl.Forms.Application.Run;
    end
    else
    begin
      if not Vcl.SvcMgr.Application.DelayInitialize or Vcl.SvcMgr.Application.Installing then
        Vcl.SvcMgr.Application.Initialize;

      Vcl.SvcMgr.Application.CreateForm(TsrvServer, srvServer);
      Vcl.SvcMgr.Application.Run;
    end;

  finally
    par.Free;
  end;


end.


TcmdLineParams ist nur meine Kapselung um bequem auf die Kommandozeilenparameter zugreifen zu können. Wenn ich also der Exe ein -StartAsApplication übergebe, wird das Mainform erzeugt und gestartet. Ansonsten halt der TService. Das scheint problemlos zu funktionieren.

Meine Frage ist eigentlich ganz einfach: Kann man das so machen, oder schieß ich mir damit irgendwie ins Knie?

Danke!


jaenicke - Mo 21.10.13 11:54

Das funktioniert, ich würde das allerdings automatisch entsprechend behandeln. Das habe ich bei uns im Büro für unsere Dienste auch immer so implementiert, ebenfalls mit Datenmodulen usw.

Einen Parameter mitgeben zu müssen um die Anwendung als normale Anwendung starten zu können, finde ich jetzt nicht so schön...


Nersgatt - Mo 21.10.13 11:56

Danke, das wollte ich hören.
Ich habe es absichtlich mit Parameter gemacht. Der Parameter wird auch nicht (offiziell) dokumentiert. Die Kunden sollen das Dingen immer als Dienst starten. Das ist nur für mich eine Hilfe. Und unser Support wird das evtl. ab und an nutzen.


jaenicke - Mo 21.10.13 11:59

user profile iconNersgatt hat folgendes geschrieben Zum zitierten Posting springen:
Ich habe es absichtlich mit Parameter gemacht. Der Parameter wird auch nicht (offiziell) dokumentiert. Die Kunden sollen das Dingen immer als Dienst starten.
Ich finde es einfach sehr praktisch, wenn ich den Dienst einfach normal starten kann und dort dann direkt die Möglichkeit habe z.B. den Dienst zu steuern, also installieren (bei manchen unserer Dienste auch mit alternativem Namen um mehrere Instanzen zu ermöglichen), deinstallieren, starten, stoppen, ... natürlich inkl. Anfordern der Adminrechte und Statusanzeige.

Für andere Zwecke gibt es natürlich auch bei uns Parameter.