2009-09-16 41 views
7

我正在嘗試用MingW構建Windows服務。它需要線程安全的異常,所以我添加了鏈接標誌-ththreads。該應用程序在命令行下工作正常,但是當我嘗試從services.msc啓動時,1054錯誤(「服務未及時響應啓動或控制請求」)被引發。如果我在沒有-mthreads標誌的情況下重新構建服務,服務將啓動。我如何才能使用-ththreadsMingW的多線程Windows服務

回答

1

我不知道你是否可以在作爲服務運行時進行調試。當服務主機運行它時,必定會有一些讓你的程序驚慌的事情。也許嘗試附加一個調試器到svchost.exe,至少你可以看到哪些模塊被加載,並且可能導致崩潰的異常。

+0

將調試器附加到svchost.exe沒有幫助。該服務沒有得到啓動的機會。甚至在此之前拋出錯誤。 – 2009-09-17 03:48:56

1

你的應用程序甚至可以啓動嗎?在main函數的開始處撥打OutputDebugString(或等效函數),看看它是否能達到那麼遠。 (抓鬥DbgViewSysInternals如果沒有它的話)

如果沒有走到這一步,我們開始了明顯的檢查:這是沒有找到運行時DLL的應用程序的問題?這可能是因爲您的PATH中包含常規運行時,但無法找到MT版本。這可以解釋你描述的行爲。您可能需要複製MT運行時或相應地更新PATH。

+0

該應用程序甚至沒有啓動。但它從命令行運行。所以它不能成爲運行時庫的問題。 – 2009-09-21 13:53:23

+0

運行時庫的MT版本在哪裏?它應該在應用程序目錄中。運行時庫可能在PATH中作爲用戶運行,但不作爲系統運行。使用depends.exe來追蹤你所依賴的dll。您也可以嘗試以另一個用戶身份運行該應用程序。 – 2009-09-21 17:43:29

5

我懷疑-mthreads引入了對DLL的依賴關係,並且該DLL作爲服務運行時不在路徑上。在我的cygwin環境中,如果我用「-mno-cygwin -mthreads」編譯了一個簡單的程序,我得到了對MINGWM10.DLL的依賴,當它作爲一個服務運行時,肯定不會在路徑上。如果我嘗試在沒有設置PATH的情況下運行它,它會在開始加載時崩潰(並在應用程序事件日誌中留下一片咕嚕聲)。

我會在Dependency Walker(http://www.dependencywalker.com)中調出你的exe文件,看看你在加載時正在加載什麼,並檢查你的Windows事件日誌以查看是否有任何提示。您可能需要將它需要的DLL副本放在可執行文件中。

2

在工作目錄或[編輯:系統,而不是每個用戶] PATH中需要mingwm10.dll,因爲使用-mthread選項編譯的C++程序具有該依賴關係。如果你非常確定你的代碼永遠不會拋出異常,也不會通過堆棧傳播,那麼使用-fno-exception而不是-mthread來解決依賴關係。