name: Win32-services category: System version: 0.4 cabal-version: 1.16 build-type: Simple author: Michael Steele maintainer: Michael Steele copyright: Copyright 2011-2018 Michael Steele homepage: http://github.com/mikesteele81/win32-services bug-reports: http://github.com/mikesteele81/win32-services/issues license: BSD3 license-file: LICENSE tested-with: GHC == 7.6.3, GHC == 7.8.3, GHC == 7.10.1, GHC == 8.2.2, GHC == 8.4.3 stability: provisional synopsis: Windows service applications description: 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: . * Only services running within their own process are supported. These are processes of the "WIN32_OWN_PROCESS" type. . * 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 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:\programming\test\>ghc --make -threaded Main.hs [1 of 1] Compiling Main ( Main.hs, Main.o ) Linking Main.exe ... \ 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 @ . extra-source-files: changelog examples/*.hs source-repository head type: git location: git://github.com/mikesteele81/win32-services.git library build-depends: base >= 4.5 && < 5.0 , Win32 >= 2.2 && < 2.8 , Win32-errors >= 0.2 && < 0.3 default-language: Haskell2010 ghc-options: -Wall hs-source-dirs: src Exposed-Modules: System.Win32.Services Extra-Libraries: Advapi32 -- Extra-Lib-Dirs: "C:\\Program Files (x86)\\Windows Kits\\8.0\\Lib\\win8\\um\\x86" -- Extra-Lib-Dirs: "C:\\Program Files (x86)\\Windows Kits\\8.1\\Lib\\winv6.3\\um\\x64" -- Extra-Lib-Dirs: "C:\\Program Files (x86)\\Windows Kits\\10\\Lib\\10.0.15063.0\\um\\x64\\AdvAPI32.Lib" -- Extra-Lib-Dirs: c:\Windows\System32 other-modules: Import , System.Win32.Services.Raw , System.Win32.Services.Accept , System.Win32.Services.Control , System.Win32.Services.State , System.Win32.Services.Status , System.Win32.Services.TableEntry , System.Win32.Services.Type -- executable SimpleExample -- hs-source-dirs: examples -- main-is: simple.hs -- ghc-options: -threaded -rtsopts -with-rtsopts=-N -- build-depends: base, Win32-services, Win32-errors -- default-language: Haskell2010 -- -- executable OfficialExample -- hs-source-dirs: examples -- main-is: official.hs -- ghc-options: -threaded -rtsopts -with-rtsopts=-N -eventlog -- build-depends: base, Win32-services, Win32, Win32-errors -- default-language: Haskell2010