Einzelnen Beitrag anzeigen

ele

Registriert seit: 18. Feb 2009
129 Beiträge
 
Delphi 2010 Professional
 
#9

AW: Dienst/Service oder VCL-Anwendung

  Alt 23. Dez 2010, 21:51
Ich schreibe meine Server-Anwendungen immer als Service mit Webinterface. Über das Webinterface steuert, überwacht und konfiguriert man den Service.

Die Komplette Logik ist in einer Klasse abgelegt die etwa so aussieht:

Delphi-Quellcode:
  TServiceState = (ssStopped, ssRunning, ssPaused);
  TServiceClass = class( TObject )
  protected
    FState: TServiceState;
    FIsService: Boolean;
    function GetServiceName(): String; virtual;
    function GetDisplayName(): String; virtual;
    function GetDescription(): String; virtual;
  public
    constructor Create(); virtual;
    destructor Destroy(); override;

    procedure Start(); virtual;
    procedure Stop(); virtual;
    procedure Pause(); virtual;
    procedure Resume(); virtual;
    procedure Restart(); virtual;
    procedure Execute(); virtual;

    property State: TServiceState read FState;
    property ServiceName: String read GetServiceName;
    property DisplayName: String read GetDisplayName;
    property Description: String read GetDescription;
    property IsService: Boolean read FIsService;
  end;
(In der Realität ist das ganze etwas komplizierter, ich kann aber meine Vorlage nicht einfach so open source stellen. Aber es geht hier ums Prinzip.)

Dann habe ich zwei Projekte - ein VCL Projekt und ein Service - die jeweils die Funktionen in der oben genannten Klasse aufrufen. Somit Programmiert man die Logik nur einmal, kann sie im VCL Projekt testen und debuggen und hat dann für den produktiven Betrieb einen Service.

Das macht das Entwickeln eines Services wesentlich einfacher. Allerdings muss man aufpassen, da ein Service eben nicht ganz unter den selben Bedingungen läuft wie eine übliche Windows Applikation. Das betrifft z.B. das aktuelle Verzeichnis, Window Handles (versuch mal Window Messages in einem Service zu behandeln) und z.B. darf man nicht vergessen CoInitialize() aufzurufen wenn man COM benutzen will (direkt oder indirekt). Auch läuft ein Dienst in der Regel unter dem System Benutzer, was andere Zugriffsrechte zur Folge hat. Z.B sind Netzlaufwerke die man eingerichtet hat unter dem Systembenutzer nicht zugänglich.
  Mit Zitat antworten Zitat