Zum Inhalt springen

VB .Net - Fragen zu Windows Dienst


hapke

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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


Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...