ServiceController (1.9.331)

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

ServiceController (1.9.331)

Beitrag von Lewi »

Ich beschäfftige mich gerade mit dem Thema xBase++ Anwendung als Dienst.
Dabei bin ich im Rahmen der Entwicklung auf einige Dinge gestoßen.

Als Grundlage dieses Threads dient folgende Beispielcode, der von dem SimpleService-Beispiel von ALASKA abgleitet ist:

Code: Alles auswählen

//////////////////////////////////////////////////////////////////////
//
//  KVISCTRL.PRG
//
//  Inhalt:
//     Programm zur Kontrolle des services kvisservice.exe
//
//  Syntax:
//     simplectr <isxu> [".\AccountName" "Passwort"]
//
//     Flags:
//
//        i installiert den Service simpleservice.exe
//          Bei der Installation muss der Account Name und das
//          Passwort dieses Accounts uebergeben werden.
//          ( Achtung: Der Punkt und der Backslash (".\") muessen
//                     vor dem Account Namen stehen  )
//        s started den Service
//        x stoppt den Service
//        u deinstalliert den Service
//
//////////////////////////////////////////////////////////////////////

#include "service.ch"
#include "os.ch"
#include "simpleio.ch"
#Include "fileIo.ch"
#define CRLF Chr( 13 ) + Chr( 10 )

CLASS Logger
  EXPORTED:
    INLINE METHOD write( cMsg )
      OutStd( cMsg )
  RETURN SELF
ENDCLASS

PROCEDURE AppSys()
RETURN

FUNCTION ChkOsVersion()
  LOCAL cFamily, cFullName

  cFamily := Os( OS_FAMILY )
  IF "WIN9X" == cFamily
    cFullName := OS( OS_FULLNAME )
    OutStd( cFullName + " unterstuetzt keine Dienste" )
    RETURN .F.
  ENDIF

RETURN .T.

PROCEDURE Main( cFlag, cUser, cPass )
  LOCAL cLocation, oLog, oCtrl, cServiceName, lOk

  lOk := .F.

  IF ! CheckParam( cFlag, cUser, cPass )
    Quit
  ENDIF

  IF ! ChkOsVersion()
    Quit
  ENDIF
  cServiceName := "KVISSERVICE"
  cLocation    := CurDrive() + ":\" + CurDir() + "\"
  oLog         := Logger():new()
  oCtrl        := ServiceController()

  oCtrl:addController( cServiceName ,                       ;
                       "_TestService"     , ;
                        cLocation + cServiceName + ".exe" , ;
                       cUser, cPass,  /*parameter*/ , ;
                       oLog )
  DO CASE
  CASE cFlag == "i"
    OutStd( "installiere..." + CRLF )
    lOk := ServiceController():install( cServiceName )
  CASE cFlag == "s"
    OutStd( "starte..." + CRLF )
    lOk := ServiceController():start( cServiceName )
  CASE cFlag == "x"
    OutStd( "stoppe..." + CRLF )
    lOk := ServiceController():stop( cServiceName )
  CASE cFlag == "u"
    OutStd( "deinstalliere..." + CRLF )
    lOk := ServiceController():uninstall( cServiceName )
   CASE cFlag == "c"
    OutStd( "continue ..." + CRLF )
    lOk := ServiceController():Continue( cServiceName )

   CASE cFlag == "p"
    OutStd( "pause ..." + CRLF )
    lOk := ServiceController():pause( cServiceName )

  OTHERWISE
    Usage()
    Quit
  ENDCASE

  IF lOk
    OutStd( "OK" )
  ENDIF

RETURN

FUNCTION CheckParam( cFlag, cUser, cPass )

  IF ! "C" == Valtype( cFlag )
    Usage()
    RETURN .F.
  ENDIF

  IF ! cFlag $ "iscxup"
    Usage()
    RETURN .F.
  ENDIF

  IF cFlag == "i"
    IF "U" == Valtype( cUser ) .OR. ;
       "U" == Valtype( cPass )
      Usage()
      RETURN .F.
    ENDIF
  ENDIF

RETURN .T.

PROCEDURE Usage()
  local cTxt

TEXT INTO cTxt WRAP
  Nutzung:

     kvisctrl <isxu> [".\AccountName" "Passwort"]

  Flags:

     i installiert den Service KvisService.exe
       Bei der Installation muss der Account Name und das
       Passwort dieses Accounts uebergeben werden.
       ( Achtung: Der Punkt und der Backslash (".\") muessen
                  vor dem Account Namen stehen  )
     s started den Service
     x stoppt den Service
     p service auf Pause setzen
     c service fortsetzen
     u deinstalliert den Service

ENDTEXT

OutStd( cTxt )
RETURN

Code: Alles auswählen

//////////////////////////////////////////////////////////////////////
//
//  KVISSERVICE.PRG
//
//  Inhalt:
//     Implemenierung des services kvisservice
//
//  Bemerkungen:
//     Dieser service wird nicht direkt ausgefuehrt.
//     Um ihn zu kontrollieren kann die Applikation kvisctrl.exe
//     benutzt werden.
//
//////////////////////////////////////////////////////////////////////

#include "service.ch"
#include "Xbp.ch"
#include "Common.ch"

#define CRLF Chr( 13 ) + Chr( 10 )

PROCEDURE Main()
   PUBLIC lRunning := .F.
   Public nTone    := 400
   Public lPause   := .F.

   ON SERVICE MAIN MainFunc
   ON SERVICE STOP StopFunc
   ON SERVICE CONTINUE TestContinue
   ON SERVICE PAUSE TestPause
   SERVICE EXECUTE
RETURN



PROCEDURE MainFunc()
   lRunning := .T.
   lPause   := .F.
   DO WHILE lRunning
      if ! lPause
         Tone( nTone, 9 )
      ENDIF
      Sleep( 500 )
   ENDDO
RETURN


PROCEDURE StopFunc()
   lRunning := .F.
RETURN

Procedure TestContinue()
   lPause := .F.
   WriteStatusFile("CallFunc->TestContinue()")
Return

Procedure testPause()
//   lPause := IIF( lPause, .F., lPause)
   lPause := .T.
   WriteStatusFile("CallFunc->TestPause()")
Return


PROCEDURE WriteStatusFile( cText )
  Local cFile := Upper(AppName(.t.))
  Local cStr

  cFile := StrTran(cFile, ".EXE", ".LOG")

  cStr := "CurDir: " + CurDrive() + ":\" + CurDir() + CRLF + ;
         "AppName: " + AppName(.t.) + CRLF + ;
         "Status: " + cText + CRLF

   If memowrit( cFile, cStr )
      nTone := nTone + 100
   ELSE
      nTone := 100
   endif
RETURN
Nun zu Anomalien:

Die Anweisung: ServiceController():Continue( cServiceName ) wird anscheinend nicht ausgeführt
Liegt der Fehler bei mir? Alle anderen Funktionen der ServiceController-Klasse funktionieren hingegen.

Vielleicht kein Fehler, aber die Funktion "CurDir()" liefert - im Dienst aufgerufen - das Windows-Verzeichnis zurück

Gruß, Olaf
Testservice.zip
Beispielcode als gezipptes Projekt
(63.76 KiB) 184-mal heruntergeladen
Antworten