Win32-services: Windows service applications

[ bsd3, library, system ] [ Propose Tags ]

This package provides a partial binding to the Win32 System Services API. It makes it easy to write Windows service applications using Haskell. _This is the first version that supports both 32-bit and 64-bit versions of GHC._

The binding is partial. Here are a few ways in which it differs from the official API:

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 source tree.

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.

Installation Notes:

Depending on which version of GHC you are using you may also need to add a extra-lib-dirs directive. In GHC version 8.4.3 it works out of the box with the libadvapi32.a file in ...\mingw\x86_64-w64-mingw32\lib. For older version you need to use a version from a Windows SDK. Your .cabal file will then 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"

If building with stack an option is to set it in stack.yaml. For example with the Windows 10 SDK installed with Build Tools for Visual Studio 2017:

extra-lib-dirs:
- C:\Program Files (x86)\Windows Kits\10\Lib\10.0.15063.0\um\x64
Versions 0.1, 0.2, 0.2.1, 0.2.2, 0.2.2.1, 0.2.3, 0.2.3.1, 0.2.4, 0.2.5, 0.2.5.1, 0.3, 0.4 (info)
Change log changelog
Dependencies base (>=4.5 && <5.0), Win32 (>=2.2 && <2.8), Win32-errors (==0.2.*) [details]
License BSD-3-Clause
Copyright Copyright 2011-2018 Michael Steele
Author Michael Steele
Maintainer Michael Steele <mikesteele81@gmail.com>
Category System
Home page http://github.com/mikesteele81/win32-services
Bug tracker http://github.com/mikesteele81/win32-services/issues
Source repo head: git clone git://github.com/mikesteele81/win32-services.git
Uploaded by gussen at Tue Jul 24 10:46:15 UTC 2018
Distributions NixOS:0.4
Downloads 4531 total (25 in the last 30 days)
Rating (no votes yet) [estimated by rule of succession]
Your Rating
  • λ
  • λ
  • λ
Status Docs uploaded by user
Build status unknown [no reports yet]
Hackage Matrix CI

Modules

[Index]

Downloads

Maintainer's Corner

For package maintainers and hackage trustees