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