Ü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
Step 1: Hinzufügen eines neuen Wertes
"MicroSpud"
Step 2: Eintragen des Pfades
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.
Step 1: Installieren Sie SRVANY.EXE als
Service unter Nutzung der INSTSRV.EXE
Step 2: Überprüfen, daß der Dienst
hinzugefügt wurde.
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:
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
Step 2: Hinzufügen des
"Application" Eintrags / Zeichenfolge
- Hinzufügen
/ Zeichenfolge
- Erstellen
von "Application" (REG_SZ)
- Öffnen des
Eintrags "Application" und
Eintragen des Pfades zu Ihrem Programm
Step 3: Hinzufügen optionaler Einträge, wenn
benötigt
- AppParameters
(String) - Übergabeparameter beim
Programmstart
- 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.
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.
|