2010-03-06 56 views

回答

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

http://www.pinvoke.net/default.aspx/advapi32.ControlService

3

的ServiceController.Status()財產已經使用了原生QueryServiceStatus()API函數。如果服務返回SERVICE_START_PENDING狀態碼,它將返回ServiceControllerStatus.StartPending。

您必須按原樣獲取返回值,服務完全控制其狀態代碼。如果您從未獲得StartPending,那麼該服務很可能就不需要任何時間開始。這是相當普遍的。如果您發現服務在一段時間內沒有響應,即使您獲得了「運行狀態」,但服務實施中仍有一個缺陷。

+0

+1:我只是想在檢查狀態之前調用ServiceController.Refresh()方法的時候添加大多數情況,它給了我正確的狀態。 – 2010-03-06 15:03:14

+0

+1聽起來比我寫的更有說服力 - 我不知道託管API是如何在內部實現的。我也沒有真正理解OP的問題... 我現在將編碼更多。並學習。夥計們恪守:) – mnemosyn 2010-03-07 00:52:09

+0

@mnemosyn:遠離它,你的獨到見解非常有價值。託管代碼沒有神祕感,Windows API不變只提供了一種完成工作的方法。 99%的情況是,託管代碼與非託管代碼可以完成同樣的事情。如果託管代碼行爲異常,您只能通過嘗試猜測非託管API錯誤行爲來真正診斷它。只有例外情況更好。 – 2010-03-07 01:02:40