Windows Dienst oder nicht Dienst
-
- Beiträge: 227
- Registriert: 30.04.2009 21:21
- Computerausstattung: i5-2300 (2.8 Ghz) Win10 -64bit / PB 5.73 LTS
Windows Dienst oder nicht Dienst
Ich mal wieder mit einem Problem.
Ich habe ein kleines Tool geschrieben, welches letztlich nichts anderes tut als alle 60 Sekunden auf die Uhr zu sehen und diesen Zeitstempel mit einem anderen Zeitstempel zu vergleichen. Wird eine bestimmte Differenz überschritten, wird ein Programm ausgeführt. Also eigentlich ein Autostart tool. Nach Adam Riese werden 1440 Aktionen innerhalb von 24 Stunden ausgeführt.
Jetzt ist das Problem aufgetreten, dass das Programm abstürzt. Folgende Fehlersignatur kann ausgelesen werden
Problemsignatur:
Problemereignisname: BEX
Anwendungsname: Autostart.exe
Anwendungsversion: 0.0.0.0
Anwendungszeitstempel: 555b5904
Fehlermodulname: StackHash_0a9e
Fehlermodulversion: 0.0.0.0
Fehlermodulzeitstempel: 00000000
Ausnahmeoffset: 00000000
Ausnahmecode: c0000005 (laut Microsoft STATUS_ACCESS_VIOLATION)
Ausnahmedaten: 00000008
Betriebsystemversion: 6.1.7601.2.1.0.18.10
Gebietsschema-ID: 1031
Zusatzinformation 1: 0a9e
Zusatzinformation 2: 0a9e372d3b4ad19135b953a78882e789
Zusatzinformation 3: 0a9e
Zusatzinformation 4: 0a9e372d3b4ad19135b953a78882e789
Mit STATUS_ACCESS_VIOLATION kann ich jetzt erst einmal nicht viel anfangen.
Der Programmaufruf folgt einmalig bei Systemstart. Es ist kein programmierter "Dienst" sondern nur eine Applikation die im Hintergrund läuft.
Kann man das so machen oder muss das über einen "Dienst" abgearbeitet werden oder nimmt man einfachheitshalber Windowseigene Bordmittel wie den Taskmanager.
Freue mich auf rege Kommentare
Ich habe ein kleines Tool geschrieben, welches letztlich nichts anderes tut als alle 60 Sekunden auf die Uhr zu sehen und diesen Zeitstempel mit einem anderen Zeitstempel zu vergleichen. Wird eine bestimmte Differenz überschritten, wird ein Programm ausgeführt. Also eigentlich ein Autostart tool. Nach Adam Riese werden 1440 Aktionen innerhalb von 24 Stunden ausgeführt.
Jetzt ist das Problem aufgetreten, dass das Programm abstürzt. Folgende Fehlersignatur kann ausgelesen werden
Problemsignatur:
Problemereignisname: BEX
Anwendungsname: Autostart.exe
Anwendungsversion: 0.0.0.0
Anwendungszeitstempel: 555b5904
Fehlermodulname: StackHash_0a9e
Fehlermodulversion: 0.0.0.0
Fehlermodulzeitstempel: 00000000
Ausnahmeoffset: 00000000
Ausnahmecode: c0000005 (laut Microsoft STATUS_ACCESS_VIOLATION)
Ausnahmedaten: 00000008
Betriebsystemversion: 6.1.7601.2.1.0.18.10
Gebietsschema-ID: 1031
Zusatzinformation 1: 0a9e
Zusatzinformation 2: 0a9e372d3b4ad19135b953a78882e789
Zusatzinformation 3: 0a9e
Zusatzinformation 4: 0a9e372d3b4ad19135b953a78882e789
Mit STATUS_ACCESS_VIOLATION kann ich jetzt erst einmal nicht viel anfangen.
Der Programmaufruf folgt einmalig bei Systemstart. Es ist kein programmierter "Dienst" sondern nur eine Applikation die im Hintergrund läuft.
Kann man das so machen oder muss das über einen "Dienst" abgearbeitet werden oder nimmt man einfachheitshalber Windowseigene Bordmittel wie den Taskmanager.
Freue mich auf rege Kommentare
Wissen schadet nur dem, der es nicht hat !
Re: Windows Dienst oder nicht Dienst
ich denke, dass Du hier eine geplante Aufgabe (Scheduled Task) meinst. In diesem Fall: ich würde das so machen.MenschMarkus hat geschrieben:oder nimmt man einfachheitshalber Windowseigene Bordmittel wie den Taskmanager.
Grüße ... Peter
a²+b²=mc²
-
- Beiträge: 227
- Registriert: 30.04.2009 21:21
- Computerausstattung: i5-2300 (2.8 Ghz) Win10 -64bit / PB 5.73 LTS
Re: Windows Dienst oder nicht Dienst
sorry, natürlich meine ich den "Task Scheduler"
Wissen schadet nur dem, der es nicht hat !
- NicTheQuick
- Ein Admin
- Beiträge: 8809
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Re: Windows Dienst oder nicht Dienst
Hier ein Zitat:
Falls du des Englischen nicht mächtig bist:I find that this usually is what's called a SIGNAL SIGSEGV or something
along those lines. Basically, you're progrgam tried to access one of the
following:
1) Another program's memory spaces without permissions.
2) Data past the end of a block of data (sometimes it causes an error,
sometimes it doesn't. Depends on what's using the memory at the time)
3) And three, calling some string functions, like strcpy() and strcat() and
passing them a pointer to a memory space that hasn't been initialized
or contains nothing. (Famous combination is GETENV, and then STRCPY,
killed me numerous times b/c GETENV returned null/empty)
- Dein Programm versucht auf den Speicherbereich eines anderen Programms zuzugreifen.
- Du liest oder schreibst Daten von einer Stelle im Speicher, die du nicht korrekt alloziert hast.
-
- Beiträge: 227
- Registriert: 30.04.2009 21:21
- Computerausstattung: i5-2300 (2.8 Ghz) Win10 -64bit / PB 5.73 LTS
Re: Windows Dienst oder nicht Dienst
Danke NicTheQuick für Deinen Beitrag.
anbei einmal das Code Snipet, welches alle 60 Sekunden ausgeführt wird:
soweit ich das sehe greife ich hier nicht explizit auf irgend einen vorab zu allokierenden Speicher zu.
Oder?
anbei einmal das Code Snipet, welches alle 60 Sekunden ausgeführt wird:
Code: Alles auswählen
If OpenWindow(#Window_x, 100, 150, 130, 100, "Autostart - SysTray", #PB_Window_SystemMenu | #PB_Window_Invisible)
AddWindowTimer(#Window_x,1,60000)
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_SysTray
If EventType() = #PB_EventType_RightClick
DisplayPopupMenu(1,WindowID(#Window_x))
EndIf
Case #PB_Event_Menu
Select EventMenu()
Case 1
; Programm aktivieren/deaktivieren
Case 2
; Zeitgesteuerten Programmstart manuell aufrufen (ohne Fenster)
Case 3
; Standard Programmaufruf
Case 4
; Wiederholsequenz einstellen (täglich)
Case 5
; Wiederholsequenz einstellen (wöchentlich)
Case 6
; Wiederholsequenz einstellen (monatlich)
Case 7
; Programm beenden
Case 8
; 60 Minuten zur Ausführungszeit hinzuaddieren
Case 9
; 60 Minuten von der Ausführungszeit subtrahieren
EndSelect
Case #PB_Event_Timer
If Aktiviert.l = 1
OpenLibrary(#mydll,ApplicationPath + "mydll.DLL")
PTyp.PReadAutoDateTime = GetFunction(#mydll,"ReadAutoDateTime") ;Zeitcode aus Registry auslesen
TMP = PTyp()
CloseLibrary(#mydll)
If TMP - Date() <= 0
RunProgram(ApplicationPath + "Application.exe","/time",ApplicationPath) ; gesteuerter Programmstart
OpenLibrary(#mydll,ApplicationPath + "mydll.DLL")
PTyp.PReadAutoSequence = GetFunction(#mydll,"ReadAutoSequence") ; eingestellte Zeitspanne aus registry auslesen
Sequence.l = PTyp()
If Sequence.l = 1 ; Tägliche Prüfung = 24 x 3600
TMP = Date() + 86400
ElseIf Sequence.l = 2 ; Wöchentliche Prüfung (alle 7 Tage)
TMP = Date() + 604800
ElseIf Sequence.l = 3 ; Monatliche Prüfung (alle 30 Tage)
TMP = Date() + 2592000
Else
Sequence.l = 2
TMP = Date() + 604800
EndIf
PTyp.PAutostartActive = GetFunction(#mydll,"AutostartActive")
PTyp(Aktiviert.l,TMP,Sequence.l)
CloseLibrary(#mydll)
EndIf
SetMenuItemText(1,0,"Nächster Programmstart " + FormatDate("%DD.%MM.%YYYY - %HH:%II h",TMP))
SysTrayIconToolTip(1,"Nächster Programmstart " + Chr(13) + " " + FormatDate("%DD.%MM.%YYYY - %HH:%II h",TMP))
EndIf
EndSelect
Until Event = #PB_Event_CloseWindow
Endif
End
Oder?
Wissen schadet nur dem, der es nicht hat !
Re: Windows Dienst oder nicht Dienst
ist mydll.DLL von Dir? Evtl. hast Du da eine unsaubere Stelle.
Ansonsten versuch mal, OpenLibrary() einmalig zu Programmstart auszuführen und CloseLibrary() zu Programmende.
Grüße ... Peter
Ansonsten versuch mal, OpenLibrary() einmalig zu Programmstart auszuführen und CloseLibrary() zu Programmende.
Grüße ... Peter
a²+b²=mc²
- NicTheQuick
- Ein Admin
- Beiträge: 8809
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Re: Windows Dienst oder nicht Dienst
Eigentlich kann der Code so gar nicht funktionieren. Einmal hat 'PTyp' den Prototyp 'PReadAutoDateTime', dann 'PReadAutoSequence' und dann 'PAutostartActive'. Aber eigentlich kann eine Variable immer nur genau einen Typ haben. Ich weiß gar nicht wie du das kompiliert kriegst. Vielleicht ein Fehler bei Purebasic?
Außerdem macht es keinen Sinn die DLL mehrmals zu öffnen und zu schließen. Öffne sie einmal bei Programmstart, hol dir alle Pointer mit 'GetFunction' und weise sie verschiedenen Variablen mit passendem Prototyp zu. Wenn du jetzt noch überprüfst, ob alle Pointer, die 'GetFunction' zurück gibt, auch tatsächlich gültig sind, sollte nichts mehr schief gehen. 'CloseLibrary()' kannst du schließlich ganz am Ende aufrufen oder weg lassen. Das macht Purebasic nämlich automatisch.
Außerdem macht es keinen Sinn die DLL mehrmals zu öffnen und zu schließen. Öffne sie einmal bei Programmstart, hol dir alle Pointer mit 'GetFunction' und weise sie verschiedenen Variablen mit passendem Prototyp zu. Wenn du jetzt noch überprüfst, ob alle Pointer, die 'GetFunction' zurück gibt, auch tatsächlich gültig sind, sollte nichts mehr schief gehen. 'CloseLibrary()' kannst du schließlich ganz am Ende aufrufen oder weg lassen. Das macht Purebasic nämlich automatisch.
-
- Beiträge: 227
- Registriert: 30.04.2009 21:21
- Computerausstattung: i5-2300 (2.8 Ghz) Win10 -64bit / PB 5.73 LTS
Re: Windows Dienst oder nicht Dienst
@Kiffi
@NicTheQuick
Ich hatte mich eigentlich an die PB Hilfe gehalten, die ja empfiehlt, Prototypen zu verwenden. In meinem Programm sind die Prototypen natürlich vorab deklariert worden. Vielleicht war das die Ursache für ein Missverständnis, da ich das nicht erwähnt hatte. Der Code war ja nur ein Snippet und keineswegs komplett dargestellt. Sorry, Mein Fehler.
Ja, ist meine eigene DLList mydll.DLL von Dir?
@NicTheQuick
Hm. Was soll ich darauf sagen, er tut es.Eigentlich kann der Code so gar nicht funktionieren.
Ich hatte mich eigentlich an die PB Hilfe gehalten, die ja empfiehlt, Prototypen zu verwenden. In meinem Programm sind die Prototypen natürlich vorab deklariert worden. Vielleicht war das die Ursache für ein Missverständnis, da ich das nicht erwähnt hatte. Der Code war ja nur ein Snippet und keineswegs komplett dargestellt. Sorry, Mein Fehler.
Der Gedanke dahinter war einfach Resourcen zu schonen. Bleibt das Programm 24 Stunden am Laufen bleibt bei einmaligem Öffnen der Bibliothek auch diese über die Laufzeit des Programmes geöffnet. Daher habe ich sie immer wieder geschlossen und nur bei Events geöffnet. Soll die Bibliothek dennoch ungeachted der aktiven Nutzung permanent geöffnet bleiben?Außerdem macht es keinen Sinn die DLL mehrmals zu öffnen und zu schließen
Wissen schadet nur dem, der es nicht hat !
- NicTheQuick
- Ein Admin
- Beiträge: 8809
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Re: Windows Dienst oder nicht Dienst
Die DLL kann das ganze Programm lang geladen bleiben. Zeit kostet es eher sie ständig zu laden und zu entladen.
Das Problem bezüglich 'PTyp' ist das folgende:
Einer Variable mit nativem Typ oder eine Struktur kann man nicht danach einen anderen Typ oder eine andere Struktur zuweisen. Komischerweise geht das aber mit Prototypen, was eigentlich vom Compiler verhindert werden sollte.
Das Problem bezüglich 'PTyp' ist das folgende:
Code: Alles auswählen
Prototype.i proto0()
Prototype.i proto1(a.i)
func.proto0 = 1234
func.proto1 = 5678 ;<- Hier sollte ein Compilerfehler auftreten
var.i = 123
var.d = 456.789 ;<- Hier tritt er schließlich auch auf
Structure struc0
a.i
EndStructure
Structure struc1
a.i
b.i
EndStructure
struc.struc0
struc.struc1 ;<- Und hier auch
-
- Beiträge: 227
- Registriert: 30.04.2009 21:21
- Computerausstattung: i5-2300 (2.8 Ghz) Win10 -64bit / PB 5.73 LTS
Re: Windows Dienst oder nicht Dienst
Einverstanden.
Wenn ich es richtig interpretiere wäre also:
korrekt und sollte keinen Fehler verursachen ?
Wenn ich es richtig interpretiere wäre also:
Code: Alles auswählen
;Deklaration Prototypen
Prototype.i proto0(0)
Prototype.i proto1(a.i)
;Wertezuweisung
func0.proto0 = 1234
func1.proto1 = 5678
Wissen schadet nur dem, der es nicht hat !