Windows Dienst oder nicht Dienst

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
MenschMarkus
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

Beitrag von MenschMarkus »

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
Wissen schadet nur dem, der es nicht hat !
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Windows Dienst oder nicht Dienst

Beitrag von Kiffi »

MenschMarkus hat geschrieben:oder nimmt man einfachheitshalber Windowseigene Bordmittel wie den Taskmanager.
ich denke, dass Du hier eine geplante Aufgabe (Scheduled Task) meinst. In diesem Fall: ich würde das so machen.

Grüße ... Peter
a²+b²=mc²
MenschMarkus
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

Beitrag von MenschMarkus »

sorry, natürlich meine ich den "Task Scheduler"
Wissen schadet nur dem, der es nicht hat !
Benutzeravatar
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

Beitrag von NicTheQuick »

Hier ein Zitat:
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)
Falls du des Englischen nicht mächtig bist:
  1. Dein Programm versucht auf den Speicherbereich eines anderen Programms zuzugreifen.
  2. Du liest oder schreibst Daten von einer Stelle im Speicher, die du nicht korrekt alloziert hast.
MenschMarkus
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

Beitrag von MenschMarkus »

Danke NicTheQuick für Deinen Beitrag.

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
soweit ich das sehe greife ich hier nicht explizit auf irgend einen vorab zu allokierenden Speicher zu.
Oder?
Wissen schadet nur dem, der es nicht hat !
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Windows Dienst oder nicht Dienst

Beitrag von Kiffi »

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
a²+b²=mc²
Benutzeravatar
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

Beitrag von NicTheQuick »

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.
MenschMarkus
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

Beitrag von MenschMarkus »

@Kiffi
ist mydll.DLL von Dir?
Ja, ist meine eigene DLL

@NicTheQuick
Eigentlich kann der Code so gar nicht funktionieren.
Hm. Was soll ich darauf sagen, er tut es.
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.
Außerdem macht es keinen Sinn die DLL mehrmals zu öffnen und zu schließen
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?
Wissen schadet nur dem, der es nicht hat !
Benutzeravatar
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

Beitrag von NicTheQuick »

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:

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
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.
MenschMarkus
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

Beitrag von MenschMarkus »

Einverstanden.

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
korrekt und sollte keinen Fehler verursachen ?
Wissen schadet nur dem, der es nicht hat !
Antworten