Wie kann ich eine VB Anwendung unter Windows 95 oder Windows NT 3.51 und höher als Dienst laufen lassen.

 

Copyrighthinweis :
Dieser Artikel ist geistiges Eingentum von Chris J. Duke
Der Artikel ist in seinem Orginal einsehbar auf den Internetseiten von Advanced Visual Basic
http://vb.duke.net
Eine Verbreitung im Ganzen oder in Auszügen ist untersagt.
July, 1997

In eigener Sache :
Wenn ich Ihnen diesen Artikel zur Verfügung stelle, so geschieht dies mit dem ausdrücklichen Verweiß
auf die Urheberschaft. Ich bin der Meinung, daß dieser Verweiß und der zugrundliegende Anlaß, Ihnen diesen
Artikel als deutsche Übersetzung zur Verfügung zu stellen mit dem Recht auf uneingeschränkten Informationszugang im Einklang steht und somit keinen Copyright Verstoß darstellt.
Andy Gamper - Mai 1998


Übersetzung des Orginalartikels aus dem Englischen

Dieser Artikel ist der erste in einer neuen Serie mit dem Namen "Wie kann ich ..." von AVB.
Bitte teilen Sie uns mit, welche Artikel zukünftig erscheinen sollen.

Sie beherrschen VB meisterhaft und wollen Ihr neues Produkt nun als kommerzielle Anwendung freigeben.
In letzter Minute teilt Ihnen Ihr Chef mit, das die Anwendung unter Windows NT als Dienst laufen muß.
Sie sagen zu Ihm, "Kein Problem" und gehen zurück an Ihren Arbeitsplatz um festzustellen, das Sie mit
den VB eigenen Mitteln nicht zum Ziel kommen.
Sie suchen in der Microsoft Knowledge Base, im Internet und in den Newsgroups nach Antworten,
und dann entdecken Sie dies hier .... die AVB "Wie kann ich ..." Artikel Serie

Was Sie für unmöglich hielten, ist nun leichter als Sie dachten.


Dieser Artikel wird erläutern, wie man ein VB4 oder VB5 Programm als Dienst unter Windows95
bzw. Windows NT 3.51 und höher programmieren kann. Wenn das Programm als Dienst läuft, wird es vor dem Login gestartet
und benötigt daher keine Anmeldung. Dies ist besonders in Netzwerken , auf Servern oder bei Anwendungen die
immer laufen müssen, interessant.

Der nachfolgende Artikel zeigt, wie Ihre VB Anwendung in ein richtiges NT Service Programm umgewandelt wird,
einfach in dem das ActiveX Control in die Form eingefügt wird.

Windows 95

Im Gegensatz zu Windows NT ist es unter Windows95 sehr einfach ein Programm als Dienst laufen zu lassen.
Dies ist dem minimaleren Sicherheitsstandard bei Windows95 zu verdanken.
Hierzu genügt lediglich ein Registry Eintrag unter nachfolgendem Schlüssel:

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunServices

Ein Beispiel. Wenn Ihre Anwendung über "MicroSpud" gestartet wird, so erzeugen Sie einen Eintrag "MicroSpud" und übergeben diesem als Wert den Programmpfad. Dazu folgende drei Schritte

Add a new string value
Step 1: Hinzufügen eines neuen Wertes "MicroSpud"

Enter the path to your executable
Step 2: Eintragen des Pfades

Fini!
Step 3: Fertig ! - PC neu starten und das Programm startet vor der Anmeldung

Windows 95 Tray Icon Quirk

Es gibt aber eine Eigenart.
Programme die ein Symbol in die Taskbar ablegen wollen, können diese nicht finden, da Sie vor der Anmeldung nicht existiert.

Folgendes würde passieren

  • Windows 95 startet
  • Ihre Anwendung startet als Service
  • Ihre Anwendung will ein Symbol in die Taskbar setzen, dies mißlingt (da nicht vorhanden)
  • Die Useranmeldung erfolgt
  • Der Desktop wird geladen
  • Ihr Symbol ist nicht in der Taskleiste

Um dies dennoch zu erreichen, nutzen Sie die Shell_NotifyIcon() API Funktion, diese liefert einen Rückgabewert (Boolean), der
True meldet, wenn das Symbol in der Taskbar erscheint. Erstellen Sie nun einen Timer, der dies aller 5 Sekunden prüft und so das
Symbol auch nach der Anmeldung noch in die Taskbar setzt. Fertig.

Windows NT

Sie haben nun erfahren, wie einfach der Start eines Programm's als Dienst unter Windows 95 zu erreichen ist.
Wie so oft, ist es unter Windows 3.51 oder höher ganz anders.

Der Grund für die Schwirigkeit unter Windows NT ein Programm als Dienst laufen zu lassen ist, weil alle Dienste vom
Service Control Manager (SCM) gesteuert werden. Hier sind ein paar mehr Einträge in die Registry notwendig, ein Programm
als Dienst unter Windows NT laufen zu lassen.

Zuerst einmal muß die Anwendung Multi-Threading unterstützen.
Zur Kommunikation mit dem Service Control Manager (SCM) werden einige Treads benötigt.
VB unterstützt kein Multi-Threading, so das VB Programme nicht als Dienst unter NT laufen können.
(Das in VB5 unterstützte "apartment model" Threading, ist kein echtes Multi-Threading)

Microsoft, erkannte die Schwierigkeiten, die nicht nur VB Programme haben, und entwickelte eine Lösung,
mit der sich gut arbeiten läßt.
Man entwickelte ein kleines Dienstprogramm, welches auf der Windows NT Resource Kit CD enthalten ist.
Dieses Dienstprogramm heißt SRVANY.EXE und arbeitet als Wirtsprogramm für Ihre Anwendung.
SRVANY übernimmt dabei die Arbeit, mit dem SCM zu kommunizieren, sobald es startet.
Es schaut in die Registry und ermittelt dort, wo Ihre Anwendung liegt und startet dieses.
Der einzige Nachteil ist, das der SCM über die SRVANY die TerminateProcess() API Funktion benutzt
um Ihr Programm ohne Vorwarnung zu killen.

Die Konfiguration Ihrer Anwendung als NT Service ist machbar, aber bei weitem nicht so einfach wie unter Windows 95.
Bevor ich Ihnen den schrittweisen Weg aufzeige, müssen sie einiges verstehen.

Es gibt zwei Microsoft Programme, die Sie benötigen.
Das Erste wurde schon erwähnt, die SRVANY.EXE.

Dieses Programm muß sich im WINNT\SYSTEM32 oder in Ihrem Programmverzeichnis befinden.
Dabei ist es wichtig zu wissen, das nicht Ihr Programm der Dienst ist, sondern die SRVANY.EXE und nicht Ihr Programm
wird als Dienst gestartet, sondern die SRVANY.EXE startet Ihr Programm.

Das zweite Programm heißt INSTSRV.EXE.

Dieses Programm installiert die SRVANY.EXE in Form eines NT Services
Es ist ein Befehlszeilen Programm und wird nur einmal zur Installation eines Dienstes aufgerufen.
Soll ein Dienst deinstalliert werden, erfolgt dies auch über die INSTSRV.EXE.

Hier erhalten Sie eine visuelle schrittweise Einführung zur Nutzung der SRVANY.EXE.
Dabei wird als Beispiel die Abnwendung "MicroSpud" genutzt.

Voraussetzung:

  • Sie müssen als Administrator angemeldet sein, um einen Dienst zu installieren.
  • Die Beispielanwendung befindet sich im Verzeichnis C:\Programm Dateien\MicroSpud\mspud.exe
  • Die Programme SRVANY.EXE und INSTSRV.EXE befinden sich im WINNT\SYSTEM32 Verzeichnis.

Install app using INSTSRV
Step 1: Installieren Sie SRVANY.EXE als Service unter Nutzung der INSTSRV.EXE

Verify service was added
Step 2: Überprüfen, daß der Dienst hinzugefügt wurde.

Configure service
Step 3: Konfigurieren Sie Ihren Dienst ( Startart & Anmeldung )

Jetzt ist Ihr Dienst erstellt. Wenn sie ihn aber jetzt starten würden, so würden Sie eine Fehlermeldung erhalten.
Sie müssen jetzt der SRVANY.EXE mitteilen, wo sich Ihre Anwendung befindet, damit die SRVANY.EXE Ihre Anwendung
starten kann, wenn der SCM die SRVANY.EXE startet.
Die folgenden Schritte komplettieren die Einrichtung Ihrer Anwendung als Dienst:

Add a Parameters key
Step 1: Hinzufügen der obigen Einträge mit den entsprechenden Werten

  • Starten Sie den Registryeditor
  • Sie finden den Eintrag unter
    HKLM\SYSTEM\CurrentControlSet\Services\MicroSpud
  • Hinzufügen der Einträge, inklusive der Werte

Add an Application parameter
Step 2: Hinzufügen des "Application" Eintrags / Zeichenfolge

  1. Hinzufügen / Zeichenfolge
  2. Erstellen von "Application" (REG_SZ)
  3. Öffnen des Eintrags "Application" und Eintragen des Pfades zu Ihrem Programm

Add optional values?
Step 3: Hinzufügen optionaler Einträge, wenn benötigt

  1. AppParameters (String) - Übergabeparameter beim Programmstart
  2. AppDirectory (String) - Arbeitsverzeichnis

Herzlichen Glückwunsch!
Sie haben erfolgreich Ihre VB Anwendung als Windows NT Dienst eingerichtet.
Starten Sie Ihren PC neu und Sie werden sehen, das Ihre Anwendung vor der Anmeldung gestartet wird.

Bitte bedenken sie, daß dies ein Beispiel zur Einrichtung eines Dienstes war, Sie müssen dieses nach Ihren Erfordernissen modifizieren.

  • Bei den Werten der Registry Einträge brauchen Sie keine Groß-/Kleinschreibung beachten
  • Zum Deinstallieren des Dienstes wird wieder die INSTSRV.EXE verwendet (INSTSRV Name des Dienstes REMOVE)
  • Es gibt drei Wege zum Starten eines Dienstes
    • Über das Dienste Symbol in der Systemsteuerung
    • Die Nutzung des Programms SC.EXE (SC START Name des Dienstes)
    • Die Nutzung des Programms NET.EXE (NET START Name des Dienstes)
  • Es gibt drei Wege einen Dienst zu Beenden
    • Über das Dienste Symbol in der Systemsteuerung
    • Die Nutzung des Programms SC.EXE (SC STOP Name des Dienstes)
    • Die Nutzung des Programms NET.EXE (NET STOP Name des Dienstes)
  • Wenn der Dienst beendet wird, wird die Anwendung über die Win32 API Funktion TerminateProcess() beendet.
    Dies ist ein sehr drastischer Weg und es gibt keine Möglichkeit zum Abfangen der Funktion und ggf. Abspeicherung von Daten.Sollten in Ihrer als Dienst laufenden Anwendung Daten bearbeitet werden, so sollten Sie diese Daten gleich nach Bekanntwerden abspeichern, da alle gepufferten Daten verloren gehen.
  • Das Programm SRVANY.EXE kann für mehrer Dienste genutzt werden, die Namen der Dienstes müssen sich aber unterscheiden.

Wichtig

  • Win32 Anwendungen mit Programmfenster, erhalten beim Abmelden des aktiven Users die WM_QUERYENDSESSION und WM_ENDSESSION Anweisungen. Einige Anwendungen beenden sich bei diesen Anweisungen.
    Um dies auszuschließen, muß diese Anweisung abgefangen werden.
    • Public Const WM_QUERYENDSESSION = &H11
    • Public Const WM_ENDSESSION = &H16
  • Alle Win32 Concolen Anwendungen erhalten beim Abmelden des aktiven Users ein CTRL_LOGOFF_EVENT.
    Um zu gewährleisten, daß sich Ihre Anwendung nicht beendet, müssen Sie dies abfangen.
    • Public Const CTRL_LOGOFF_EVENT = 5

Microsoft rät außerdem folgendes :

  • Wenn SRVANY scheitert beim starten ihrer Anwendung, versuchen Sie zuerst einmal den Eintrag "AppDirectory" für Ihren Dienst in die Registry einzutragen, es gibt das Arbeitsverzeichnis für Ihre Anwendung an.
  • Ein Dienst kann auch an eine bestimmte Useranmeldung gebunden sein, dies muß über die Eigenschaften unter Systemsteuerung/Dienste definiert werden. Sie können aber auch von Ihrer Anwendung Umgebungsvariablen auslesen lassen.
  • Einschränkungen von Seiten des Windows NT Systems an Dienste sind, entweder ist die Anwendung interaktiv ( Fenster ) oder hat Netzwerkzugriff ( nicht beides zur gleichen Zeit )
    Anm.: Übersetzung aus dem englischen - ohne Gewährleistung auf Richtigkeit.
    Org. Text
    : "Due to a restriction enforced by Windows NT on services, the application can either be interactive (have a Console, read keyboard input etc.) or have network access (not both at the same time). "

Service Abhängigkeiten

Eine nicht dokumentierte Funktion der SRVANY die Sie wissen sollten ist der "DependOnService" Eintrag in der Registry.
Angenommen Ihr Dienst benötigt andere Dienste.
Wie kann Ihr Dienstprogramm beim Start wissen, ob andere Dienste verfügbar sind?
Für ein Beispiel nehmen wir an, unser Dienst ist ein Web Server.
Es ist daher notwendig, das TCPIP verfügbar ist, bevor unser Dienst startet

Dieser Binärwert für "DependOnService" kann zu den Einträgen in der Registry hinzugefügt werden
Wie auch andere Einträge ( u.a. "DisplayName" oder "ObjectName" )

Betrachten sie nachfolgende Grafik.
Es zeigt, wie man hinzufügt, die Abhängigkeit zu TCPIP und die Reaktion des Dienstes je nach vorgefundenen Zustand.
Um den Service Namen zu ermitteln, mit dem eine Abhängigkeit erstellt werden soll, suchen Sie in der Registry nach dem Namen.

In unserem Beispiel steht der Eintrag unter HKLM\SYSTEM\CurrentControlSet\Services for TCP/IP und lautet "Tcpip",
und für das Ereignisprotokoll lautet der Name "EventLog"

Beide Einträge werden mit der Eingabe 00 getrennt.

MicroSpud is dependent on TCP/IP and the Event Log

Windows 95 und Windows NT Services

Dieser Artikel sollte aufzeigen, wie man eine VB4 bzw. VB5 Anwendung als Dienst unter Windows 95 bzw. Windows NT 3.51 und höher laufen lassen kann.
Auch wenn mit VB5 einige neue Funktionen hinzu gekommen sind, so kann man damit keine richtigen NT Dienste erstellen.
Nach Informationen von Desaware benötigt Ihre neue Version 5.0 von SpyWorks die SRVANY nicht mehr und kann eigenständige VB Anwendungen als NT Dienste laufen lassen. Es soll sich dabei um eine OCX Control handeln.
Dies soll getestet und in einem zukünftigen Artikel beschrieben werden.

Copyrightangaben:

Dieser Artikel ist geschrieben für die Leser der Advanced Visual Basic Web Site (http://vb.duke.net).
Eine Verbreitung im Ganzen oder in Auszügen ist untersagt.
Kommentare und Hinweise sind willkommen, es kann allerdings kein Support für die MS Produkte SRVANY und INSTSRV übernommen werden. Informatione dazu erhält man im MS Technical Support oder in der MS Knowledge Base.