Ich habe mir für solche Fälle, ich nenne es mal ein "Framework" gebastelt, das wie folgt aussieht:
Die eigentliche Logik des Service steht in einem Datenmodul, bzw. weiterer Code usw. kann in weitere Datenmodulen ausgelagert, die vom Haupt-Datenmodul aufgerufen werden. Um das Haupt-Datenmodul herum habe ich zwei Projekte gebastelt, das eine, der eigentliche Dienst, das andere das selbe als ganz normale EXE-Datei.
Was bringt mir das? Ich kann meine Logik unabhängig vom Dienst testen. Als ganz normale EXE debuggen usw. Wenn dort alles funktioniert, dann erzeuge ich mein Projekt "Dienst" komplett neu und kann mir sicher sein, dass es funzt.
Zusätzlich habe ich noch ein einfacher Log-Mechanismus eingebaut, der bei der EXE die Infos in ein Memofeld schreibt, beim Dienst ins Windows Ereignisprotokoll.
Ich habe den ganzen Code mal angehängt.
Folgendes ist noch zu beachten:
Ich benutze das unter XE, in wie weit das unter älteren Version klappt muss selbst probiert werden.
In den Projektoptionen für die Test-EXE ist die Bedingung "xEXE" definiert. Damit binde ich im Datenmodul eine Referenz zum EXE-Formualar ein. Im Fall vom Dienst wird dann entsprechend die Hauptunit vom Dienst eingebunden. Durch dies wird die entsprechende "LogMessage" aufgerufen.
Deshalb beachten, dass beim Wechsel von der EXE zum Datenmodul und umgekehrt immer das gesamte Projekt erzeugt wird, damit es damit keine Probleme gibt.
Mit den
Indy-Komponenten ist eine Funktion "SendMail" eingebaut. Infos für das Senden werden aus einer Ini-Datei gelesen, die im selben Ordner wie der Dienst abgelegt sein sollte. Wer das nicht braucht, kann das ja rauswerfen.
Wenn jemand MadExcept benutzt, kann in uServiceMain ein "MadExceptionHandler" einfügen und das Ereignis OnException hinzufügen. Meinen auskommentierten Code dann einbinden. Es wird dann die Exceptions ins Windows EreignisLog gespeichert und auch per eMail versendet.
Beim Starten vom Dienst wird jedesmal eine aussagekräftige Beschreibung für den Dienst im Windows abgelegt (Anzeige in der MMC bei den Diensten). Das könnte man auch beim Installieren einmalig machen, da ich aber beim Kunden immer nur die EXE tausche ohne das Ganze wieder komplett zu installieren, mache ich das so und die Beschreibung wird dann auch aktualisiert.
In der Projektdatei der EXE kann ich dann auch "ReportMemoryLeaksOnShutdown" setzen, um zu prüfen, ob ich keine Speicherlöscher eingebaut habe. Wenn da nichts ist, kann man auch sicher sein, dass es im Dienst damit auch keine Probleme gibt.
Viel Spaß beim Anschauen und benutzen. Wer fragen hat, einfach melden.