Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

VB .Net - Fragen zu Windows Dienst

Empfohlene Antworten

Veröffentlicht

Halli Hallo,

habe vor einen Windows Dienst zu entwickeln.

Aufgaben sollen sein zu einer bestimmten Uhrzeit und wenn von einem anderen Rechner ein Signal gesendet wird eine bestimmte Funktion auszuführen.

Bisherige Überlegungen:

Das Signal von außen ist ein String der via Winsock Verbindung gesendet wird.

Problem: Wie plaziert man in einem Dienst ein Window Control? Bzw in wiefern ist es möglich dieses auf ein User Control zu plazieren und von dort aufzurufen?

Die andere Frage die ich mir auch noch stelle ist, wie man die Systemzeit zu einer bestimmten Zeit "abfängt" vielleicht ohne einen Timer am laufen zu haben der alle 60 Sekunden prüft ob die Uhrzeit erreicht ist um Resourcen zu sparen!?

Könnt ihr mir helfen? Habt ihr Ideen?

Danke schonmal

Timo

nimm nen timer! [vorrausgesetzt du hast > 8MHz und > 128kb ram ;)]

alle 60 sekunden kann in einem dummen fall (murphy!!! -> also immer ;) ) bedeuten

16:59:59.89 und nächster tick 17:01:00.08

wenn du nun um 17 uhr was machen willst, hat er es verpennt. wenn du alle 45 sekunden prüfst, kann es sein, dass du 2 x die 17:00 erwischst (17:00:10 und 17:00:55). -> drum niumm nen timer.

Problem: Wie plaziert man in einem Dienst ein Window Control?

GAR NICHT!

ein dienst läuft immer, auch wenn keiner angemeldet ist.

neim googlen hast du dieses bestimmt auch schon gefunden:

CodeGuru: Creating a Windows Service in VB.NET

bigredeyes

die thematik ist im übrigen in der MSDN sehr schön beschrieben.

How to: Create Windows Services

s'Amstel

Danke erstmal für die bisherigen Antworten.

Habe jetzt eine normale Windows Anwendung erstellt und diese mit Hilfe dieses Workshops => vb@rchiv · Dienst mit VB erstellen

kann ich die Anwendung jetzt als Dienst installieren.

Jetzt habe ich jedoch das Problem das ich die Anwendung als Dienst nicht starten kann

Meldung:

"Der Dienst 'ServiceWarcher' auf "Lokaler Computer" konnte nicht gestartet werden.

Fehler 1053: Der Dienst antwortete nicht rechtzeitig auf die Start- oder Steuerungsanforderung"

Unten einmal mein aktueller Source Code.

Das Prüfen der Systemzeit habe ich jetzt mit einem Timer gelöst wie oben genannt. Zeit Interwall auf 45 Sekunden und in einer Variable das aktuelle Datum, welches beim ersten Aufrufen dann in der Variable gespeichert wird und für den Tag dann nicht mehr ausgeführt wird.

Wie gesagt jetzt erstmal das Problem mit dem Starten des Dienstes.

Danke Timo



Public Class Form1

    Dim last_date As Date

    Dim filenameService As String = "C:/ServiceStatus.log"

    Dim filenameEvents As String = "C:/ServiceEvents.log"


    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Select Case Command()

            Case "-install"

                NTService1.Interactive = True

                If NTService1.Install Then

                    MsgBox("Dienst erfolgreich installiert")

                Else

                    MsgBox("Dienst konnte nicht installiert werden")

                End If

                Application.Exit()

            Case "-uninstall"


                If NTService1.Uninstall Then

                    MsgBox("Dienst erfolgreich deinstalliert")

                Else

                    MsgBox("Dienst konnte nicht deinstalliert werden")

                End If

                Application.Exit()

            Case "-debug"

                NTService1.Debug = True

            Case Is <> ""

                MsgBox("Invalid command option")

                Application.Exit()

            Case Else

                Timer1.Enabled = True

                NTService1.StartService()


                Winsock1.Listen()


                Log(filenameService, "Dienst wurde gestartet")

        End Select

    End Sub


    Private Sub NTService1_Continue(ByVal sender As Object, ByVal e As AxNTService._DNtSvcEvents_ContinueEvent) Handles NTService1.Continue

        Log(filenameService, "Dienst wurde fortgesetzt")

        Winsock1.Listen()

        Timer1.Enabled = True

    End Sub


    Private Sub NTService1_Pause(ByVal sender As Object, ByVal e As AxNTService._DNtSvcEvents_PauseEvent) Handles NTService1.Pause

        Log(filenameService, "Dienst wurde angehalten")

        Winsock1.Close()

        Timer1.Enabled = False

    End Sub


    Private Sub NTService1_Start(ByVal sender As Object, ByVal e As AxNTService._DNtSvcEvents_StartEvent) Handles NTService1.Start

        Log(filenameService, "Dienst wurde gestartet")

        Winsock1.Listen()

        Timer1.Enabled = True

    End Sub


    Private Sub NTService1_Stop(ByVal sender As Object, ByVal e As System.EventArgs) Handles NTService1.Stop

        Log(filenameService, "Dienst wurde gestoppt")

        Winsock1.Close()

        Timer1.Enabled = False

    End Sub


    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

        If last_date <> Date.Today Then

            'If ((Now.Hour = 11) And (Now.Minute <> 23) And (Now.Second < 45)) Then

            If ((Now.Hour = 4) And (Now.Minute = 0) And (Now.Second < 45)) Then

                timerCalled()

                last_date = Date.Today

            End If

        End If

    End Sub


    Function timerCalled() As Object

        Try

            Log(filenameEvents, "Timer Event - Dienst(e) neugestartet")

        Catch ex As Exception

            Log(filenameEvents, "Fehler: Timer Event - Dienst(e) neugestartet")

        End Try

    End Function


    Function Log(ByVal datei As String, ByVal info As String)

        Dim logDatei As New System.IO.StreamWriter(datei, True)

        logDatei.WriteLine(Now & " - " & info)

        logDatei.Close()

    End Function


    Private Sub Winsock1_DataArrival1(ByVal sender As System.Object, ByVal e As AxMSWinsockLib.DMSWinsockControlEvents_DataArrivalEvent) Handles Winsock1.DataArrival

        Dim str As String = ""

        Winsock1.GetData(str)


        Dim str_code As String = str.Substring(0, 2)


        Dim str_name As String = ""

        If str.Length <> 2 Then

            str_name = str.Substring(3, str.Length - 3)

        End If


        Select Case str_code

            Case "/1" 'Disconnect

                System.Threading.Thread.Sleep(5000)

                Winsock1.Close()

                Log(filenameEvents, "Verbindung geschlossen")

                Winsock1.Listen()


            Case "/2" 'Starten

                Log(filenameEvents, "Dienst Starten (" & str_name & ")")


            Case "/3" 'Beenden

                Log(filenameEvents, "Dienst Beenden (" & str_name & ")")


            Case "/4" 'Pause

                Log(filenameEvents, "Dienst Pause (" & str_name & ")")


            Case "/5" 'Restarte

                Log(filenameEvents, "Dienst Restarte (" & str_name & ")")

        End Select

    End Sub


    Private Sub Winsock1_ConnectionRequest1(ByVal sender As System.Object, ByVal e As AxMSWinsockLib.DMSWinsockControlEvents_ConnectionRequestEvent) Handles Winsock1.ConnectionRequest

        Winsock1.Close()

        Winsock1.Accept(e.requestID)

        Log(filenameService, "Neue Verbindung Aufgebaut")

    End Sub

End Class


dein code compiliert ohne fehler und warnungen?

dein dienst heisst wirklich "ServiceWarcher"?

hast du versucht, den dienst sowohl über net start, als auch über MMC zu starten?

wo behandelst du eigentlich die Winsock-einstellungen wie den port, auf dem gelauscht wird?

du läufst in den ERROR_SERVICE_REQUEST_TIMEOUT, d.h. dein dienst benötigt zu lange. ich würde versuchen, den Timer erst nach starten des dienstes in den status Enabled zu versetzen.

s'Amstel

dein code compiliert ohne fehler und warnungen?
Ja

dein dienst heisst wirklich "ServiceWarcher"?
Ups nein er heißt ServiceWatcher :)

hast du versucht, den dienst sowohl über net start, als auch über MMC zu starten?
habe ihn über net start gestartet und über die verwaltung (glaube auch mmc abgekürzt bin mir aber nicht ganz sicher)

wo behandelst du eigentlich die Winsock-einstellungen wie den port, auf dem gelauscht wird?
Die habe ich direkt im Control angegeben. LocalPort und RemotePort: 8080 / Protokoll: sckTCPProtocol

du läufst in den ERROR_SERVICE_REQUEST_TIMEOUT, d.h. dein dienst benötigt zu lange. ich würde versuchen, den Timer erst nach starten des dienstes in den status Enabled zu versetzen.
Funktioniert leider auch noch nicht. Habe das Timer1.Enabled = True unter NTService1_Start gesetzt. Leider ohne Erfolg.

Auch durch erstellen eines Threads bekomme ich den Dienst nicht gestartet.

In der Verwaltung unter Dienste steht er generell immer als "Wird gestartet" wenn ich versuche ihn zu starten und er auf die Fehlermeldung läuft. Danach nur noch zu beenden über den Taskmanager.

Timo

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.