VB 5/6-Tipp 0467: Programm als NT-Service (Dienst) starten
von ActiveVB
Beschreibung
Basiert auf der MSDN. Hiermit kann man ein VB Programm als Dienst (Service) starten. Zum Installieren muss das Programm mit dem Parameter "-install" gestartet werden, zum Deinstallieren mit dem Parameter "-uninstall"
7. Februar 2003: Einige Bugs wurden behoben von Thomas Galland, vielen Dank!
Dieser Tipp funktioniert entweder nur in kompilierter Form oder benötigt eine DLL/OCX-Datei. Diese Binärdateien sind dem Tipp hinzugefügt worden, um seinen Funktionsumfang darstellen zu können. Vor dem Upload wurden sie auf Viren geprüft.
Schwierigkeitsgrad: | Verwendete API-Aufrufe: | Download: |
'Dieser Quellcode stammt von http://www.activevb.de 'und kann frei verwendet werden. Für eventuelle Schäden 'wird nicht gehaftet. 'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum. 'Ansonsten viel Spaß und Erfolg mit diesem Source! '-------------- Anfang Projektdatei SAMPLE.VBP -------------- ' Es muss ein Verweis auf 'Standard OLE Types' gesetzt werden. ' Die Komponente 'Microsoft Windows Common Controls 5.0 (SP2) (comctl32.ocx)' wird benötigt. ' Die Komponente ' (ntsvc.ocx)' wird benötigt. '------ Anfang Formular "ServiceMain" alias sample.Frm ------ ' Steuerelement: Timersteuerelement "Timer" ' Steuerelement: NTService Control "NTService1" ' Steuerelement: Erweiterte Statusbar "StatusBar" 'Basiert auf einem Code aus der MSDN-Library. '(C) MSDN 'TITLE: An OLE Control for Creating Win32 Services in Visual Basic 'Mauricio Ordóñez 'Microsoft Consulting Services 'June 1996 Private Declare Sub DebugBreak Lib "kernel32" () Option Explicit Private Sub Form_Load() On Error Goto Err_Load Dim strDisplayName As String Dim bStarted As Boolean strDisplayName = NTService1.DisplayName StatusBar.Panels(1).Text = "Starte..." ' Befehle zur Interaktion mit dem Desktop If Command = "-install" Then 'Installieren NTService1.Interactive = True If NTService1.Install Then Call NTService1.SaveSetting("Parameters", _ "TimerInterval", "1000") MsgBox strDisplayName & " erfolgreich installiert." Else MsgBox strDisplayName & " konnte nicht installiert werden." End If End ElseIf Command = "-uninstall" Then 'Deinstallieren If NTService1.Uninstall Then MsgBox strDisplayName & " erfolgreich deinstalliert." Else MsgBox strDisplayName & " konnte nicht deinstalliert werden." End If End ElseIf Command = "-debug" Then NTService1.Debug = True ElseIf Command <> "" Then MsgBox "Unbekannter Kommandozeilenparameter" End End If StatusBar.Panels(1).Text = "Lade Konfiguration" Dim parmInterval As String parmInterval = NTService1.GetSetting("Parameters", _ "TimerInterval", "2000") Timer.Interval = CLng(parmInterval) ' Pause/Fortfahren muss initialisiert werden, bevor ' StartService aufgerufen wurde oder man sich im ' Design Modus befindet StatusBar.Panels(1).Text = "Steuerungsmodus aktiviert" NTService1.ControlsAccepted = svcCtrlPauseContinue ' Service zum "Windows NT services controller" verbinden StatusBar.Panels(1).Text = "Starte Verbindung" NTService1.StartService Exit Sub Err_Load: If NTService1.Interactive Then MsgBox "[" & Err.Number & "] " & Err.Description End Else Call NTService1.LogEvent(svcMessageError, svcEventError, "[" _ & Err.Number & "] " & Err.Description) End If End Sub Private Sub NTService1_Continue(Success As Boolean) On Error Goto Err_Continue Timer.Enabled = True StatusBar.Panels(1).Text = "Fortgefahren" Success = True Call NTService1.LogEvent(svcEventInformation, svcMessageInfo, _ "Service fortgefahren") Exit Sub Err_Continue: Call NTService1.LogEvent(svcMessageError, svcEventError, "[" & _ Err.Number & "] " & Err.Description) End Sub Private Sub NTService1_Control(ByVal e As Long) On Error Goto Err_Control StatusBar.SimpleText = NTService1.DisplayName & " " & _ "Steuerungssignal " & e Exit Sub Err_Control: Call NTService1.LogEvent(svcMessageError, svcEventError, "[" & _ Err.Number & "] " & Err.Description) End Sub Private Sub NTService1_Pause(Success As Boolean) On Error Goto Err_Pause Timer.Enabled = False StatusBar.Panels(1).Text = "Pausiert" Call NTService1.LogEvent(svcEventError, svcMessageError, "Service " & _ "pausiert") Success = True Exit Sub Err_Pause: Call NTService1.LogEvent(svcMessageError, svcEventError, "[" & _ Err.Number & "] " & Err.Description) End Sub Private Sub NTService1_Start(Success As Boolean) On Error Goto Err_Start StatusBar.Panels(1).Text = "Ok" Success = True Exit Sub Err_Start: Call NTService1.LogEvent(svcMessageError, svcEventError, "[" & _ Err.Number & "] " & Err.Description) End Sub Private Sub NTService1_Stop() On Error Goto Err_Stop StatusBar.Panels(1).Text = "Gestoppt" Unload Me Exit Sub Err_Stop: Call NTService1.LogEvent(svcMessageError, svcEventError, "[" & _ Err.Number & "] " & Err.Description) End Sub Private Sub Timer_Timer() On Error Goto Err_Timer StatusBar.Panels(2).Text = Format(Now(), "hh:mm:ss") Exit Sub Err_Timer: Call NTService1.LogEvent(svcMessageError, svcEventError, "[" & _ Err.Number & "] " & Err.Description) End Sub '------- Ende Formular "ServiceMain" alias sample.Frm ------- '--------------- Ende Projektdatei SAMPLE.VBP ---------------
Tipp-Kompatibilität:
Windows/VB-Version | Win32s | Win95 | Win98 | WinME | WinNT4 | Win2000 | WinXP |
VB4 | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
VB5 | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
VB6 | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
Ihre Meinung
Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.
Archivierte Nutzerkommentare
Klicken Sie diesen Text an, wenn Sie die 30 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.
Kommentar von Jochen Wierum am 20.07.2007 um 08:43
An Gert Lindner:
Einen Prozess so früh zu starten kann ein Problem darstellen. Bevor Windows nicht die Win32 Schicht vollständig geladen hat, ist man mit VB machtlos (Das gilt meines Wissens auf für .NET). Es /könnte/ evtl. möglich sein, einen Win32 Prozess vor dem Anmeldefenster (früher auf gar keinen Fall) zu starten, ob und wie das im Detail funktioniert, kann ich allerdings nicht sagen, evtl. muss das Programm sich dann als Treiber registrieren oder sowas.
Die Besten Ergebnisse werden durch eine Frage im VB6-Forum erzielt, ich würde empfehlen, dort einfach mal zu fragen.
Mit freundlichen Grüßen
Jochen Wierum
Kommentar von Gert Lindner am 20.07.2007 um 08:30
Frage: Was muß ich tun, damit mein Dienst nach dem Booten von z.B. WXP vor der bzw. ohne Benutzeranmeldung startet?
Der Dienst greift auf COM-Ports zu. Sind diese dann schon verfügbar? Bei der Startart "Automatisch" startet der Dienst erst, wenn ich mich als Benutzer angemeldet habe.
Kommentar von Flo am 26.04.2006 um 12:48
Kann es sein das man die ntsvc.ocx unter Win Server 2003 64bit nicht registrieren kann bzw. kann mir irgendwer sagen was ich dabei falsch mache?
Kommentar von ricoiii am 28.02.2006 um 15:25
Hallo,
wenn ich die Formulareigenschaft "Visible" auf "False" setze, bekomme ich beim Beenden des Dienstes eine Speicherfehlermeldung.
Fehlermeldung:
beispiel.exe - Fehler in Anwendung
---------------------------
Die Anweisung in "0x10002212" verweist auf Speicher in "0x10002212". Der Vorgang
"read" konnte nicht auf dem Speicher durchgeführt werden.
Klicken Sie auf "OK", um das Programm zu beenden.
Klicken Sie auf "Abbrechen", um das Programm zu debuggen.
---------------------------
OK Abbrechen
---------------------------
Woran kann das denn liegen?
Ich habe wirklich nur die Visible-Eigenschaft geändert.
Mach ich es rückgängig, ist wieder alles schick.
Jemand Ideen?
Gruß Rico
Kommentar von Goodies am 05.07.2005 um 19:53
Hi,
Das mit dem Code
"app.taskvisible =false"
das ist echt geil Danke!! :)
Kommentar von Goodies am 05.07.2005 um 19:52
Hi,
Das mit dem Code
"app.taskvisible =false"
das ist echt geil Danke!! :)
Kommentar von Carsten Greve am 26.01.2005 um 10:34
Service automatisch starten:
Einfach vor dem Aufruf der Install-Funktion den Parameter StartMode=2
setzen. weitere interessante Parameter sind
Account, password
Kommentar von Carsten Greve am 26.01.2005 um 10:26
Dienst trotzdem beenden, oder wie ich "Zugriff verweigert" vermeide!
Wenn man es tatsächlich geschafft hat, den Dienst zu starten, hat man folgende Zustände:
1. Das Programm kann aus der Entwicklungsumgebung heraus NICHT als Dienst gestartet werden, sondern Compilieren, Starten, installieren, und dann aus der Dienstverwaltung heraus starten
2. als Dienst taucht es dann nicht auf der Seite der Anwendungen auf, aber auf der Seite der Prozesse
3. Man kann den Dienst dort nicht beenden->toll
Aber was, wenn man das machen muss (z.B. auf einem Server ohne Neustart-Möglichkeit)?
Antwort: kill.exe aus dem Windows NT 4.0 Recourcen Kit was aber mittlerweile schwer zu bekommen ist. Das Programm funktioniert unter NT 4.0, 2000 und XP, XP Server und kann gnadenlos jeden Prozess beenden.
Kommentar von Carsten Greve am 26.01.2005 um 10:15
Hallo,
Hier kommt ein Hinweis zur Verwendung der LogEvent-Funktion:
Leider sind die internen Definitionen der Konstanten für die LogEvent-Funktion unbrauchbar! Am besten die folgenden verwenden, dann erscheint auch nicht dieser merkwürdige Text ("Die Ereigniskennung (XX) wurde nicht gefunden...")
'1.Schritt: bas-Datei mit Definitionen anlegen
Public Const EventIDError = 109
Public Const EventIDWarning = 110
Public Const EventIDOK = 110
Public Const EventTypeError = 1
Public Const EventTypeWarning = 2
Public Const EventTypeOK = 0
'
'2. Schritt: diese dann in etwa so verwenden:
call NTService1.LogEvent(EventTypeOK ,EventIDOK )
Kommentar von Armin Apolloner am 11.08.2004 um 17:47
funktioniert bei mir nicht
My Lan Sart.exe (nicht zusammengeschrieben)
Kommentar von nguyen am 28.06.2004 um 15:30
ein geniales Service ocx .
Funktioniert gut bei mir win2000.
Wie kann ich erreichen dass der service automatisch starten?.
Bis jetzt musste ich den Servive immer manuell starten.
Kommentar von Elko am 25.06.2004 um 12:35
Kann eine DB-Anbindung über ODBC aus dem Service heraus Problemem machen, wenn mann das OCX verwendet.
Selbe DB-Anmeldung ohne OCX (keine Service) funktioniert !
Kommentar von Joachim Leckband am 21.06.2004 um 19:48
There is a better way to create a NT Service than using the "ntsvc.ocx". Please visit http://www.freevbcode.com/ShowCode.asp?ID=4317 for more information about writing a service for unattended execution. The sample also contains a Service Control Program to install, start, and delete the service.
Joe
Kommentar von NoX am 11.05.2004 um 13:02
Hallo,
genau sowas hab ich gesucht, jedoch raff ich es nicht kann mir des jemand vieleicht erklären oder ein beispielprog geben wodran ich es seh wie es funktioniert?
Gruß
NoX
Kommentar von Roberto Ricci am 18.03.2004 um 17:43
Il servizio funziona bene-
Ma avete provato ad avviarlo loggandosi su un pc-remoto???
Aprendo una sessione remota il form non si vede.
Saluti.
If i work in remote section the service don't show the form.
It's invisible form. I have the same problem.
Can you help me?????
Thank's
Kommentar von KapitänNet am 02.03.2004 um 17:43
Das Installieren und Deinstallieren klappt wunderbar.
Beim Starten oder Beenden bleibt der task im taskmanager stehen. Zudem wird im Dienstmanagere der task nicht als gestartet angezeigt.
Das Starten oder Stoppen habe ich nun so gelöst:
Dim oService As Object
Dim oComp As Object
Dim service As String
Dim computer As String
Private Sub Command1_Click(Index As Integer)
On Error Resume Next
computer = Environ("computername")
service = "NEWSLETTER"
Set oComp = GetObject("WinNT://" & computer & ",computer")
Set oService = oComp.GetObject("Service", service)
If Err.Number = 0 Then
With oService
Select Case Index
Case 0
If .Status = 4 Then
.Stop
MsgBox "Service angehalten"
End If
Case 1
If .Status = 1 Then
.Start
MsgBox "Service gestartet"
End If
End Select
End With
Else
MsgBox "Fehler: " & Err.Number & vbCrLf & _
Err.Description, vbCritical, "Fehler"
End If
End Sub
So wird im Dienstmanager der Dienst korrekt als gestartet oder gestoppt angezeigt.
Ciao Jürgen
Kommentar von MVXA am 12.01.2004 um 20:15
Joa.. läuft jetz bei mir ;)
nur ne frage, was nützt mir des wenn ich das Programm als Dienst laufen lasse ?
Kommentar von Winfried Sonntag am 27.11.2003 um 13:50
Funzt super!
Danke für das Beispiel!
Sunny
Kommentar von Urs Meyer am 22.11.2003 um 09:44
Super! Funzt einwandfrei mit WinXP und VB6. Hinweis an MVXA: Hast Du den Dienst nach dem Installieren auch gestartet? (Systemsteuerung / Wartung / Dienste --> "Beispiel Service")
Kommentar von MVXA am 21.11.2003 um 16:40
HI
Also bei mir funzt es nicht, der service konnte nicht installiert werden... ich hab WinXP mit VB6
Kommentar von Alex am 17.11.2003 um 15:24
Super! Danke Jan!!
Kommentar von Jan am 26.10.2003 um 11:12
Hallo zusammen.
Wenn der Task nicht in der Taskbar sichtbar sein soll,
dann in Form_load einfach genau das unterbinden geht auch.
app.taskvisible =false
Kommentar von Franz F. Klein am 18.10.2003 um 18:49
Funktioniert wunderbar! Danke für das Beispiel!
Gibt es eine Hilfe zu allen Funktionen der ntsvc.ocx?
Ich habe noch eingebunden den NTService1.DisplayName und NTService1.ServiceName, sowie NTService1.Startmode auf Automatic gesetzt.
Das Programm scheint auch im TaskManager in der Liste der Anwendungen nicht auf.
(Mein Programm lädt öffnet kein Fenster, und NTService1.Interacvtive=False)
@VD-Projekt)
Die exe, die im Taskamanger unter Prozesse auftaucht kannst Du nicht beenden. Wenn es ein Dienst ist kommt: Zugriff verweigert!
Grüße, FFK
Kommentar von VD-Projekt am 12.09.2003 um 14:31
Der Dienst funtzt. Meine Anwendung wird auch so gestartet, wie es sein soll. Nur leider taucht die *.exe auch im Takmanager auf, die der Dienst startet. Das sollte ja gerade durch den Dienst verhindert werden, dass man die *.exe über den Taskmanager schliessen kann. Kann mir dazu jemand weiterhelfen?!!
Tschöö VD-Projekt
Kommentar von XETH am 10.04.2003 um 11:52
Mich würde auch mal interessieren wo in diesem Code die API DubgBreak verwendet wird ;)
Kommentar von Thomas Hofer am 24.02.2003 um 11:00
hab Ihr Tip unter 2000 ausprobiert. Scheint soweit zu funktionieren. Bei meiner Applikation gibt es aber noch ein paar Probleme. Wenn ich den Dienst installiere wird das Program auch noch gestartet. Sollte eigentlich nicht sein. Könnte aber sein, daß dies noch ein Fehler in meinem Code ist. Mein Frage ist nun: Gibt es auch eine Hilfe zu dem NTSVR.OCX? Und wenn ja wo?
Kommentar von Jochen Wierum am 26.01.2003 um 10:26
Das Entsprechende OCX ist nun im Download enthalten! So sollten Fehler beim Öffnen des Projektes nicht mehr auftreten!
Das ActiveVB Team
Kommentar von hkw am 17.07.2002 um 15:25
Hallo erstmal,
ich habe eine exe zur Steuerung einer Anwendung geschrieben und diese läuft auch ohne Probleme.
Wenn ich diesselbe exe als Dienst ausführe laufe ich auf Fehler und bin nicht mehr in der Lage die Anwendung zu steuern, da die Fenster der Appliaktion die starte und steuern möchte nicht sichtbar sind.
Gibt es dafür eine bekannte Begründung und ggf. somit auch einen entsprechende Lösung ???
Vielen Dank!
Kommentar von marcus am 11.04.2002 um 08:54
warum ist der Dienst im Taskmanager als Anwendung zus sehen ?
das habe ich mir aber so nicht vorgestellt ... das soll doch ein Prozess werden ! was mach ich da nicht ganz richtig ???
Kommentar von Pichi am 23.02.2002 um 10:58
Und was macht diese Funktion/dieses Modul genau?