Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0467: Programm als NT-Service (Dienst) starten

 von 

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:

Schwierigkeitsgrad 3

Verwendete API-Aufrufe:

DebugBreak

Download:

Download des Beispielprojektes [29,88 KB]

'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-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

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.

Ring3 - name 06.03.12 02:03 5 Antworten

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?