我使用ServiceControllerStatus獲取啓動和啓動狀態的運行狀態。 有沒有辦法找到該服務是否已完全啓動如何確保Windows服務是否處於啓動或啓動狀態
0
A
回答
1
是的,但它是一個有點難看:
進口ADVAPI32.DLL:
[DllImport ("advapi32.dll", EntryPoint = "QueryServiceStatus", CharSet = CharSet.Auto)]
internal static extern bool QueryServiceStatus (IntPtr hService, ref SERVICE_STATUS dwServiceStatus);
聲明一些結構:
[StructLayout(LayoutKind.Sequential)]
public struct SERVICE_STATUS
{
public int serviceType;
public int currentState;
public int controlsAccepted;
public int win32ExitCode;
public int serviceSpecificExitCode;
public int checkPoint;
public int waitHint;
}
public enum State
{
SERVICE_STOPPED = 0x00000001,
SERVICE_START_PENDING = 0x00000002,
SERVICE_STOP_PENDING = 0x00000003,
SERVICE_RUNNING = 0x00000004,
SERVICE_CONTINUE_PENDING = 0x00000005,
SERVICE_PAUSE_PENDING = 0x00000006,
SERVICE_PAUSED = 0x00000007,
}
編輯:更容易爲用戶QueryServiceStatus()
,但總的來說它保持不變。如果我在這裏粘貼這麼多的代碼,我不認爲這會有幫助。
然後,您可以使用ControlService
和控制代碼SERVICE_CONTROL_INTERROGATE
來發出狀態信息請求。
見 http://msdn.microsoft.com/en-us/library/ms682108(VS.85).aspx
3
的ServiceController.Status()財產已經使用了原生QueryServiceStatus()API函數。如果服務返回SERVICE_START_PENDING狀態碼,它將返回ServiceControllerStatus.StartPending。
您必須按原樣獲取返回值,服務完全控制其狀態代碼。如果您從未獲得StartPending,那麼該服務很可能就不需要任何時間開始。這是相當普遍的。如果您發現服務在一段時間內沒有響應,即使您獲得了「運行狀態」,但服務實施中仍有一個缺陷。
相關問題
- 1. Windows服務保持啓動狀態
- 2. 如何正確啓動服務並保持活動狀態?
- 3. 如何確定是否在Windows服務中啓動?
- 4. 如何啓動Windows服務
- 5. 如何啓動Windows服務
- 6. 檢查服務是否在啓動時從Windows啓動
- 7. 如何檢查服務器是否處於活動狀態?(c#)
- 8. 自動啓動服務時,windows啓動
- 9. 啓動Windows服務
- 10. 如何確定Windows應用程序是否在Windows啓動時自動啓動?
- 11. 我如何啓動Windows服務自動
- 12. 服務和三項活動,啓動服務是否正確?
- 13. Windows服務啓動時啓動
- 14. 啓動Windows服務並啓動cmd
- 15. 如何使Windows服務啓動「自動(延時啓動)」
- 16. 錯誤啓動ASP.NET狀態服務
- 17. Faye服務器未啓動或啓動
- 18. 是否可以記錄誰啓動或停止了Windows服務?
- 19. 服務是否自動啓動?
- 20. 在互聯網在android中處於活動狀態時啓動服務
- 21. 基於C#的Windows服務未啓動
- 22. 確定是否屏幕處於活動狀態或不從Windows 8註冊表
- 23. 如何確保服務只能手動啓動?
- 24. Jetty保證在啓動()返回後保持啓動狀態嗎?
- 25. 如何重新啓動windows服務c#
- 26. 如何重新啓動Windows服務?
- 27. 如何啓動Rethinkdb作爲Windows服務
- 28. 如何從Windows服務啓動進程
- 29. Pyqt;服務器重啓後QTcpSocket總是處於connectedState狀態;
- 30. 雙擊啓動Windows服務
+1:我只是想在檢查狀態之前調用ServiceController.Refresh()方法的時候添加大多數情況,它給了我正確的狀態。 – 2010-03-06 15:03:14
+1聽起來比我寫的更有說服力 - 我不知道託管API是如何在內部實現的。我也沒有真正理解OP的問題... 我現在將編碼更多。並學習。夥計們恪守:) – mnemosyn 2010-03-07 00:52:09
@mnemosyn:遠離它,你的獨到見解非常有價值。託管代碼沒有神祕感,Windows API不變只提供了一種完成工作的方法。 99%的情況是,託管代碼與非託管代碼可以完成同樣的事情。如果託管代碼行爲異常,您只能通過嘗試猜測非託管API錯誤行爲來真正診斷它。只有例外情況更好。 – 2010-03-07 01:02:40