2. Get Process Hacker and create service from your exe using it, or do it another way
3. Run your service, then stop it by sending "stop" command
Code: Select all
EnableExplicit
; IncludeFile "net.pb"
Global ServiceName.s = ProgramParameter()
Global lpServiceStatus.SERVICE_STATUS
Global hServiceStatus
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Procedure ServiceHandler(fdwControl)
Select fdwControl
Case #SERVICE_CONTROL_PAUSE
lpServiceStatus\dwCurrentState = #SERVICE_PAUSED
Case #SERVICE_CONTROL_CONTINUE
lpServiceStatus\dwCurrentState = #SERVICE_RUNNING
Case #SERVICE_CONTROL_STOP, #SERVICE_CONTROL_SHUTDOWN
With lpServiceStatus
\dwCurrentState = #SERVICE_STOP_PENDING
\dwWin32ExitCode = 0
\dwServiceSpecificExitCode = 0
\dwCheckPoint = 0
\dwWaitHint = 0
EndWith
SetServiceStatus_(hServiceStatus, @lpServiceStatus)
lpServiceStatus\dwCurrentState = #SERVICE_STOPPED
SetServiceStatus_(hServiceStatus, @lpServiceStatus)
Case #SERVICE_CONTROL_INTERROGATE
EndSelect
SetServiceStatus_(hServiceStatus, @lpServiceStatus)
EndProcedure
Procedure ServiceMain()
With lpServiceStatus
\dwServiceType = #SERVICE_WIN32_OWN_PROCESS | #SERVICE_INTERACTIVE_PROCESS
\dwCurrentState = #SERVICE_START_PENDING
\dwControlsAccepted = #SERVICE_ACCEPT_STOP | #SERVICE_ACCEPT_SHUTDOWN
\dwWin32ExitCode = 0
\dwServiceSpecificExitCode = 0
\dwCheckPoint = 0
\dwWaitHint = 0
EndWith
hServiceStatus = RegisterServiceCtrlHandler_(ServiceName, @ServiceHandler())
If hServiceStatus
SetServiceStatus_(hServiceStatus, @lpServiceStatus)
lpServiceStatus\dwCurrentState = #SERVICE_RUNNING
SetServiceStatus_(hServiceStatus, @lpServiceStatus)
While lpServiceStatus\dwCurrentState = #SERVICE_RUNNING
; Proxy_tick ()
Delay(1)
Wend
With lpServiceStatus
\dwCurrentState = #SERVICE_STOP_PENDING
\dwWin32ExitCode = 0
\dwServiceSpecificExitCode = 0
\dwCheckPoint = 0
\dwWaitHint = 0
EndWith
SetServiceStatus_(hServiceStatus, @lpServiceStatus)
lpServiceStatus\dwCurrentState = #SERVICE_STOPPED
SetServiceStatus_(hServiceStatus, @lpServiceStatus)
EndIf
EndProcedure
Procedure ServiceInit()
Dim lpServiceTable.SERVICE_TABLE_ENTRY(2)
lpServiceTable(0)\lpServiceName = @ServiceName
lpServiceTable(0)\lpServiceProc = @ServiceMain()
lpServiceTable(1)\lpServiceName = #Null
lpServiceTable(1)\lpServiceProc = #Null
StartServiceCtrlDispatcher_(@lpServiceTable())
EndProcedure
InitNetwork() ; // comment it and there will be no crash
ServiceInit()