2014-03-30 292 views
2

我編寫了一個程序Windows Server 2008使用GHC 7.6.332-bit。我試圖在啓動時通過Windows內的服務運行它(並理想地保持它)。要使用下面的命令這樣做,我創建了一個服務成功運行GHC創建的Windows可執行文件作爲服務

sc create stworker binPath= "C:\Users\vagrant\Desktop\worker.exe"

我遇到的問題是,當我嘗試啓動我收到以下錯誤服務(見下圖)。

當我雙擊它時,可執行文件運行良好。所以不知道爲什麼Windows不允許該服務運行。我不認爲這是一個問題w/GHC。我假設GHC編譯爲本地代碼而不是MSIL

那麼,爲什麼我不能運行我的可執行文件作爲服務的任何想法?

enter image description here

+0

第一行支持問題,你知道一個Windows服務與應用程序不一樣嗎? – Jonke

+0

您需要調用ServiceService中的StartServiceCtrlDispatcher,RegisterServiceCtrlHandler,SetServiceStatus(至少)和SERVICE_TABLE_ENTRY – Jonke

+0

我沒有試過(因爲在我需要時它不存在),但是http://hackage.haskell.org/包/ Win32的服務 – Jonke

回答

4

正如評論所說,你需要真正實現你的程序的行爲作爲Windows服務的Win32服務API,你可以使用Win32-services包做到這一點。

還有一個包的包裝Win32-services-wrapper我寫,旨在提供一些樣板和處理日誌記錄,以便確定一個服務是這樣的:

main = 
    defineService $ 
     Service { 
      serviceName = "Service", 
      -- Start the service given a debug handle to write to. 
      -- Make sure not to use stdout or stderr as they don't exist. 
      -- Any state needed by serviceStop can be returned here - 
      -- the Service type takes the type of the state as a type parameter 
      serviceStart = \debugHandle -> ..., 
      -- Stop the service given the service state returned by serviceStart 
      serviceStop = \serviceState -> ... 
     } 

有一個在darcsden使用它的一個真實的例子。

相關問題