Windows service applications http://github.com/mikesteele81/win32-services
|Latest on Hackage:||0.3|
This package is not currently in any snapshots. If you're interested in using it, we recommend adding it to Stackage Nightly. Doing so will make builds more reliable, and allow stackage.org to host generated Haddocks.
This package provides a partial binding to the Win32 System Services API. It makes it easy to write Windows service applications using Haskell. _Only 32-bit versions of GHC are supported at this time._
The binding is partial. Here are a few ways in which it differs from the official API:
Only services running within their own process are supported. These are processes of the
In cases where multiple versions of the same function exist (for compatibility), this binding only offers one of them.
None of the extended control codes are supported. Handlers you write will automatically report this to the operating system when such controls are received.
Only facilities for writing services are supported; not controlling them.
Effort has been made to simplify using the API without hiding what is
happening behind the scenes. Users are encouraged to read Microsoft's
documentation under 'Dev Center - Desktop > Docs > Desktop app development
documentation > System Services > Services'. The official example has been
ported to Haskell. This can be found in the
examples directory of the
Simple Example and Usage
module Main where import Control.Concurrent.MVar import System.Win32.Services main = do mStop <- newEmptyMVar startServiceCtrlDispatcher "Test" 3000 (handler mStop) $ \_ _ h -> do setServiceStatus h running takeMVar mStop setServiceStatus h stopped handler mStop hStatus Stop = do setServiceStatus hStatus stopPending putMVar mStop () return True handler _ _ Interrogate = return True handler _ _ _ = return False running = ServiceStatus Win32OwnProcess Running [AcceptStop] nO_ERROR 0 0 0 stopped = ServiceStatus Win32OwnProcess Stopped  nO_ERROR 0 0 0 stopPending = ServiceStatus Win32OwnProcess StopPending [AcceptStop] nO_ERROR 0 0 0
C:programmingtest>ghc --make -threaded Main.hs [1 of 1] Compiling Main ( Main.hs, Main.o ) Linking Main.exe ... <linker warnings omitted> C:\programming\test>copy Main.exe c:\svc\Test.exe 1 file(s) copied.
Execute the following from an elevated command prompt to register the service:
C:\svc>sc create Test binPath= c:\svc\Test.exe [SC] CreateService SUCCESS
The service can now be started and stopped from the services console.
Depending on which version of Windows and the Windows SDK you are using the
.cabal file will need to be modified before installing. A simple `cabal
install Win32-services` may not work. For example, If you are building on
Windows 8 64-bit with the Windows 8 SDK the
extra-lib-dirs field will need
to be changed to read as follows:
Extra-Lib-Dirs: "C:\\Program Files (x86)\\Windows Kits\\8.0\\Lib\\win8\\um\\x86"
* bugfix in "simple" example.
* Update library dependencies to support GHC 7.10.1.
* Remove dependency on "errors" library.
* bug fix: eRROR_SERVICE_SPECIFIC_ERROR was mapped to the wrong code.
* Add upper-version bounds to build dependencies.
* Update library dependencies to support GHC 7.8.
* Update library dependencies to support GHC 7.6.
* bug fix: Services were failing to enter a STOPPED state. It is now the
user's responsibility to enter a stopped state in the service main function.
The 'startServiceCtrlDispatcher' function will continue to automatically put
the service into a START_PENDING state.
* Writing services of the WIN32_OWN_PROCESS type is now easier. Handler
registration is performed automatically. By the time the service main
function is entered, the service will already be in the 'START_PENDING'
state. It is the user's responsibility to enter the 'RUNNING' state as soon
* Once the service main function exits two things will occur. The service
will enter the 'STOPPED' state, and the handler function will be freed.
* The 'registerServiceCtrlHandlerEx' function is no longer
exported. Handlers are registered automatically by the
* The 'queryServiceStatus' function has been added.
# 0.1 series
* First release