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.