2008-09-09 135 views
6

如何在沒有創建可見命令窗口的Windows上使用Haskell創建後臺進程?在沒有可見控制檯窗口的窗口中創建後臺進程

我寫了一個Haskell程序,它定期運行備份過程,但每次運行它時,命令窗口都會打開到所有窗口的頂部。我想擺脫這個窗口。什麼是最簡單的方法來做到這一點?

+1

這個問題應該重新打開,因爲它是關於「特定的編程問題」,特別是如何在Haskell的背景下啓動一個進程。 – Cirdec 2014-09-07 21:47:02

+0

爲了重新開放而編輯/重寫。我認爲這是一個有用的問題。我也認爲它應該重新開放 – Andre 2016-08-23 20:17:54

回答

0

我能想到的最簡單的方法是從Windows Shell腳本(vbs或cmd)中運行rsync命令。

0

我對Haskell一無所知,但幾個月前我在一個C項目中遇到了這個問題。

在沒有任何窗口彈出的情況下執行外部程序的最佳方法是使用帶有「open」動詞的ShellExecuteEx()API函數。如果ShellExecuteEx()在Haskell中可用,那麼你應該能夠實現你想要的。

C代碼看起來是這樣的:

SHELLEXECUTEINFO Info; 
BOOL b; 

// Execute it 
memset (&Info, 0, sizeof (Info)); 
Info.cbSize = sizeof (Info); 
Info.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI; 
Info.hwnd = NULL; 
Info.lpVerb = "open"; 
Info.lpFile = "rsync.exe"; 
Info.lpParameters = "whatever parameters you like"; 
Info.lpDirectory = NULL; 
Info.nShow = SW_HIDE; 
b = ShellExecuteEx (&Info); 
if (b) 
    { 
    // Looks good; if there is an instance, wait for it 
    if (Info.hProcess) 
     { 
     // Wait 
     WaitForSingleObject (Info.hProcess, INFINITE); 
     } 
    } 
+0

我不相信它是直接的,但它只是一小部分的FFI。 – wnoise 2008-09-26 21:03:21

5

你真的應該告訴我們你是怎樣嘗試目前做到這一點,但我的系統上(使用Linux)下面的片段將在不打開運行命令一個新的終端窗口。它應該在Windows上以相同的方式工作。

module Main where 
import System 
import System.Process 
import Control.Monad 

main :: IO() 
main = do 
    putStrLn "Running command..." 
    pid <- runCommand "mplayer song.mp3" -- or whatever you want 
    replicateM_ 10 $ putStrLn "Doing other stuff" 
    waitForProcess pid >>= exitWith 
+1

直接在Linux命令行上運行的腳本確實傾向於在Windows中彈出cmd窗口。昨天我第一次體驗了這種快樂。 – 2008-09-09 17:02:24

4

感謝迄今的迴應,但我找到了自己的解決方案。我嘗試了很多不同的東西,從寫一個vbs腳本到建議的獨立程序hstart。 hstart的工作......但它創造了一個我不喜歡的獨立過程,因爲那樣我就無法以正常的方式殺死它。但是我發現了一個簡單的解決方案,它只需要Haskell代碼。

我之前的代碼是對runCommand的簡單調用,它沒有彈出窗口。您可以使用的替代功能是runProcess,它具有更多選項。從偷看ghc源代碼文件runProcess.c,我發現當爲所有STDIN,STOUT和STDERR提供重定向時,CREATE_NO_WINDOW標誌被設置。所以這就是你需要做的,爲這些人提供重定向。我的測試程序看起來像:

import System.Process 
import System.IO 
main = do 
    inH <- openFile "in" ReadMode 
    outH <- openFile "out" WriteMode 
    runProcess "rsync.bat" [] Nothing Nothing (Just inH) (Just outH) (Just outH) 

這工作!再沒有命令窗口!需要注意的是,你需要一個空文件來作爲STDIN事件讀入inh,儘管在我的情況下它不是必需的。