Dienst pausieren

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
BI2
Beiträge: 146
Registriert: 26.11.2006 19:07

Dienst pausieren

Beitrag von BI2 »

Hallo Leute,

ich habe ein Problem mit Diensten. Habe mir einen solchen zusammengebastelt und er funktioniert bis auf eine Kleinigkeit einwandfrei.

Ich bekomme den Dienst nicht pausiert (Pause Funktion in services.msc ist nicht anwählbar), Stoppen, Starten, Installieren und entfernen funktionieren ohne Probleme.

Für meinen spezielen Fall soll der Dienst im Pause Zustand eine andere Funktion erfüllen, als im Stop Zustand.

Irgendwie muß das doch mit dem Parameter #SERVICE_PAUSE_CONTINUE zusammenhängen, aber wie?

Ich installiere den Dienst mit folgendem Aufruf:

Code: Alles auswählen

    Case "/install" ; Installiert den Dienst im System und startet ihn
      hSCManager = OpenSCManager_(0, 0, #SC_MANAGER_CREATE_SERVICE)
      hService = CreateService_(hSCManager, ServiceName, ServiceName, #SERVICE_ALL_ACCESS | #SERVICE_PAUSE_CONTINUE, #SERVICE_WIN32_OWN_PROCESS | #SERVICE_INTERACTIVE_PROCESS, #SERVICE_AUTO_START, #SERVICE_ERROR_NORMAL, AppPath, 0, 0, 0, 0, 0)
	    If StartService_(hSERVICE, 0, 0) : EndIf
      If hSERVICE : WriteLog("Dienst installiert") : EndIf
			If hSERVICE : MessageRequester("Info","Dienst erfolgreich installiert!", #MB_ICONINFORMATION) : EndIf
      CloseServiceHandle_(hService)
      CloseServiceHandle_(hSCManager)
Hat irgendjemand eine Idee, wo hier der Fehler im Aufruf liegt?

Vielen Dank schonmal im vorraus.

Gruß, BI2
PB 5.7x (x64), LinuxMint 18.3 - Xfce (x64)

Einsteigerbuch: PureBasic - Eine Einführung in die Computer Programmierung
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Hatte ich mal im Codearchiv gefunden und angepasst. Meine Dienste laufen damit einwandfrei.

Code: Alles auswählen

; English forum:  
; Author: Richard Eikeland 
; Date: 12. April 2003 

; Apr. 12, 2003 
; Converted to PB by Richard Eikeland 
; This code is posted as is with out any waranties. 
; 
; Second Author: mk-soft
; Date: 05.08.2007

#SERVICE_WIN32_OWN_PROCESS = $10 
#SERVICE_WIN32_SHARE_PROCESS = $20 
#SERVICE_WIN32 = #SERVICE_WIN32_OWN_PROCESS + #SERVICE_WIN32_SHARE_PROCESS 
#SERVICE_ACCEPT_STOP = $1 
#SERVICE_ACCEPT_PAUSE_CONTINUE = $2 
#SERVICE_ACCEPT_SHUTDOWN = $4 
#SC_MANAGER_CONNECT = $1 
#SC_MANAGER_CREATE_SERVICE = $2 
#SC_MANAGER_ENUMERATE_SERVICE = $4 
#SC_MANAGER_LOCK = $8 
#SC_MANAGER_QUERY_LOCK_STATUS = $10 
#SC_MANAGER_MODIFY_BOOT_CONFIG = $20 

#STANDARD_RIGHTS_REQUIRED = $F0000 
#SERVICE_QUERY_CONFIG = $1 
#SERVICE_CHANGE_CONFIG = $2 
#SERVICE_QUERY_STATUS = $4 
#SERVICE_ENUMERATE_DEPENDENTS = $8 
#SERVICE_START = $10 
#SERVICE_STOP = $20 
#SERVICE_PAUSE_CONTINUE = $40 
#SERVICE_INTERROGATE = $80 
#SERVICE_USER_DEFINED_CONTROL = $100 
#SERVICE_ALL_ACCESS = #STANDARD_RIGHTS_REQUIRED | #SERVICE_QUERY_CONFIG | #SERVICE_CHANGE_CONFIG | #SERVICE_QUERY_STATUS | #SERVICE_ENUMERATE_DEPENDENTS | #SERVICE_START | #SERVICE_STOP | #SERVICE_PAUSE_CONTINUE | #SERVICE_INTERROGATE |#SERVICE_USER_DEFINED_CONTROL 

#SERVICE_DEMAND_START = $3 
#SERVICE_ERROR_NORMAL = $1 

;- SERVICE_CONTROL 
#SERVICE_CONTROL_STOP = $1 
#SERVICE_CONTROL_PAUSE = $2 
#SERVICE_CONTROL_CONTINUE = $3 
#SERVICE_CONTROL_INTERROGATE = $4 
#SERVICE_CONTROL_SHUTDOWN = $5 


;-SERVICE_STATE 
#SERVICE_STOPPED = $1 
#SERVICE_START_PENDING = $2 
#SERVICE_STOP_PENDING = $3 
#SERVICE_RUNNING = $4 
#SERVICE_CONTINUE_PENDING = $5 
#SERVICE_PAUSE_PENDING = $6 
#SERVICE_PAUSED = $7 



Global SERVICEStatus.SERVICE_STATUS, hSERVICEStatus.l, SERVICE_NAME.s, Finish.l 
Declare Handler(fdwControl.l) 
Declare SERVICEMain(dwArgc.l, lpszArgv.l) 
Declare WriteLog(Value.s) 

Procedure Main() 
   
  hSCManager.l 
  hSERVICE.l 
  SERVICETableEntry.SERVICE_TABLE_ENTRY 
  b.l 
  cmd.s 
  ;Change SERVICE_NAME and app name as needed 
  AppPath.s = ProgramFilename() ;"C:\Dev\PureBasic\workdir\NTSERVICE\MySERVICE.exe" 
  SERVICE_NAME = "MySERVICE" 
   
  cmd = Trim(LCase(ProgramParameter())) 
  Select cmd 
  Case "install" ;Install SERVICE on machine 
    hSCManager = OpenSCManager_(0, 0, #SC_MANAGER_CREATE_SERVICE) 
    hSERVICE = CreateService_(hSCManager, SERVICE_NAME, SERVICE_NAME, #SERVICE_ALL_ACCESS, #SERVICE_WIN32_OWN_PROCESS, #SERVICE_DEMAND_START, #SERVICE_ERROR_NORMAL, AppPath, 0, 0, 0, 0, 0) 
    CloseServiceHandle_(hSERVICE) 
    CloseServiceHandle_(hSCManager) 
    finish = 1 
  Case "uninstall" ;Remove SERVICE from machine 
    hSCManager = OpenSCManager_(0, 0, #SC_MANAGER_CREATE_SERVICE) 
    hSERVICE = OpenService_(hSCManager, SERVICE_NAME, #SERVICE_ALL_ACCESS) 
    DeleteService_(hSERVICE) 
    CloseServiceHandle_(hSERVICE) 
    CloseServiceHandle_(hSCManager) 
    finish = 1 
  Default 
    *sname.s = SERVICE_NAME 
    ;Start the SERVICE 
    SERVICETableEntry\lpSERVICEName = @SERVICE_NAME 
    SERVICETableEntry\lpSERVICEProc = @SERVICEMain() 
    b = StartServiceCtrlDispatcher_(@SERVICETableEntry) 
    WriteLog("Starting SERVICE bResult=" + Str(b)) 
    If b = 0 
      finish = 1 
    EndIf 
  EndSelect 
   
  Repeat 
     
  Until Finish =1 
   
  End 
   
EndProcedure 

Procedure Handler(fdwControl.l) 
  b.l 
   
  Select fdwControl 
  Case #SERVICE_CONTROL_PAUSE 
    ;** Do whatever it takes To pause here. 
  
    WriteLog("SERVICE Pause") 

    SERVICEStatus\dwCurrentState = #SERVICE_PAUSED 
  Case #SERVICE_CONTROL_CONTINUE 
    ;** Do whatever it takes To continue here. 
  
    WriteLog("SERVICE Continue") 

    SERVICEStatus\dwCurrentState = #SERVICE_RUNNING 
  Case #SERVICE_CONTROL_STOP 
    SERVICEStatus\dwWin32ExitCode = 0 
    SERVICEStatus\dwCurrentState = #SERVICE_STOP_PENDING 
    SERVICEStatus\dwCheckPoint = 0 
    SERVICEStatus\dwWaitHint = 0 ;Might want a time estimate 
    b = SetServiceStatus_(hSERVICEStatus, SERVICEStatus) 
    ;** Do whatever it takes to stop here. 
    
    WriteLog("SERVICE Stop") 

    Finish = 1 
    SERVICEStatus\dwCurrentState = #SERVICE_STOPPED 
  Case #SERVICE_CONTROL_INTERROGATE 
    ;Fall through To send current status. 
    Finish = 1 
    ;Else 
  EndSelect 
  ;Send current status. 
  b = SetServiceStatus_(hSERVICEStatus, SERVICEStatus) 
EndProcedure 

Procedure SERVICEMain(dwArgc.l, lpszArgv.l) 
  b.l 
  WriteLog("SERVICE Main") 
  ;Set initial state 
  SERVICEStatus\dwSERVICEType = #SERVICE_WIN32_OWN_PROCESS 
  SERVICEStatus\dwCurrentState = #SERVICE_START_PENDING 
  SERVICEStatus\dwControlsAccepted = #SERVICE_ACCEPT_STOP | #SERVICE_ACCEPT_PAUSE_CONTINUE | #SERVICE_ACCEPT_SHUTDOWN 
  SERVICEStatus\dwWin32ExitCode = 0 
  SERVICEStatus\dwSERVICESpecificExitCode = 0 
  SERVICEStatus\dwCheckPoint = 0 
  SERVICEStatus\dwWaitHint = 0 
   
  hSERVICEStatus = RegisterServiceCtrlHandler_(SERVICE_NAME, @Handler()) 
  SERVICEStatus\dwCurrentState = #SERVICE_START_PENDING 
  b = SetServiceStatus_(hSERVICEStatus, SERVICEStatus) 
   
  ;** Do Initialization Here 

  WriteLog("SERVICE Init") 

  SERVICEStatus\dwCurrentState = #SERVICE_RUNNING 
  b = SetServiceStatus_(hSERVICEStatus, SERVICEStatus) 
   
  ;** Perform tasks -- If none exit 
   
  ;** If an error occurs the following should be used for shutting 
  ;** down: 
  ; SetServerStatus SERVICE_STOP_PENDING 
  ; Clean up 
  ; SetServerStatus SERVICE_STOPPED 
EndProcedure 

Procedure WriteLog(Value.s)
  ; Path anpassen 
  sfile.s = "d:\Ablage\MyService.Log" 
  If OpenFile(0, sfile)
    FileSeek(0, Lof(0)) 
    WriteStringN(0,Value) 
    CloseFile(0) 
  EndIf 
   
EndProcedure 

Main() 
Für PB v4.x angepasst

FF :wink:

P.S. Was der Dient machen soll läuft bei mir als Thread.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
BI2
Beiträge: 146
Registriert: 26.11.2006 19:07

Beitrag von BI2 »

@ mk-soft: Danke für die Antwort, habe aber mein Problem just in diesem Moment gelöst.

ich habe #SERVICE_ACCEPT_PAUSE_CONTINUE in ServiceStatus\dwControlsAccepted vergessen. jetzt funktioniert alles einwandfrei. :allright: :twisted:

Gruß, BI2
PB 5.7x (x64), LinuxMint 18.3 - Xfce (x64)

Einsteigerbuch: PureBasic - Eine Einführung in die Computer Programmierung
Antworten