服務觸發程式事件
服務可以註冊,以在觸發程式事件發生時啟動或停止。 這樣就不需要在系統啟動時啟動服務,或讓服務輪詢或主動等候事件;服務可以在需要時啟動,而不是在有工作要做時自動啟動。 預先定義的觸發程式事件的範例包括指定裝置介面類別的裝置抵達,或特定防火牆埠的可用性。 服務也可以註冊 Windows (ETW) 提供者 事件追蹤所產生的自定義觸發程式事件。
Windows Server 2008、Windows Vista、Windows Server 2003 和 Windows XP:在 Windows Server 2008 R2 和 Windows 7 之前,不支援 服務觸發程式事件。
觸發程式是由觸發程式事件類型、觸發程式事件子類型、回應觸發程式事件所採取的動作,以及一或多個觸發程式特定數據項所組成。 子類型和觸發程式特定的數據項會同時指定通知事件服務的條件。 數據項的格式取決於觸發程式事件類型;數據項可以是二進位數據、字串或多字串。 字串必須是 Unicode;不支援 ANSI 字串。
為了註冊觸發程式事件,服務會使用 SERVICE_CONFIG_TRIGGER_INFO 呼叫 ChangeServiceConfig2,並提供 SERVICE_TRIGGER_INFO 結構。 SERVICE_TRIGGER_INFO 結構指向 SERVICE_TRIGGER 結構的陣列,每個都指定一個觸發程式。
如果系統啟動時觸發條件為 true,或當系統執行時觸發條件變成 true,則會採取指定的觸發程式動作。 例如,如果服務註冊在特定裝置可用時啟動,當系統啟動時,如果裝置已經插入計算機,就會啟動服務;如果使用者在系統執行時插入裝置,就會啟動服務。
如果觸發程式具有觸發程式特定的數據項,只有在觸發程式事件隨附的數據項符合服務指定之其中一個觸發程式的數據項時,才會採取觸發程序動作。 二進位數據比對是透過位比較來完成。 字串比對不區分大小寫。 如果數據項是多字串,則多字串中的所有字串都必須相符。
當服務啟動以回應觸發程式事件時,服務會在其 ServiceMain 回呼函式中收到 argv[1] SERVICE_TRIGGER_STARTED_ARGUMENT。 Argv[0] 一律是服務的簡短名稱。
註冊以回應觸發程式事件的服務,在服務沒有工作時,可能會在閑置逾時后自行停止。 停止本身的服務必須準備好處理在服務停止時抵達的 SERVICE_CONTROL_TRIGGEREVENT 控制要求。 每當服務處於執行中狀態時發生新的觸發程式事件時,SCM 就會傳送 SERVICE_CONTROL_TRIGGEREVENT 控件要求。 為了避免遺失觸發程式事件,服務應該傳回 ERROR_SHUTDOWN_IN_PROGRESS 服務從執行到停止時抵達的任何 SERVICE_CONTROL_TRIGGEREVENT 控制要求。 這會指示 SCM 將觸發程式事件排入佇列,並等候服務進入停止狀態。 接著,SCM 會採取與佇列觸發程式事件相關聯的動作,例如啟動服務。
當服務準備好再次處理觸發事件時,它會在呼叫 setServiceStatus時,在控件接受的遮罩中設定SERVICE_ACCEPT_TRIGGEREVENT。 當服務使用 SERVICE_RUNNING呼叫 setServiceStatus 時,通常會完成此作業。 SCM 接著會針對每個佇列觸發程式事件發出 SERVICE_CONTROL_TRIGGEREVENT 要求,直到佇列是空的。
無法停止執行相依服務的服務,以回應觸發程式事件。
在記憶體不足的情況下,不保證觸發程式啟動和觸發停止要求。
使用 QueryServiceConfig2 函式來擷取服務的觸發程式事件組態。
SC 工具 (sc.exe) 可用來在命令提示字元設定或查詢服務的觸發事件。 使用 triggerinfo 選項來設定服務以啟動或停止以響應觸發程式事件。 使用 qtriggerinfo 選項來查詢服務的觸發程式組態。
下列範例會查詢 W32time 服務的觸發程式組態,其設定為在計算機加入網域時啟動,並在電腦離開網域時停止。
C:\>sc qtriggerinfo w32time
[SC] QueryServiceConfig2 SUCCESS
SERVICE_NAME: w32time
START SERVICE
DOMAIN JOINED STATUS : 1ce20aba-9851-4421-9430-1ddeb766e809 [DOMAIN JOINED]
STOP SERVICE
DOMAIN JOINED STATUS : ddaf516e-58c2-4866-9574-c3b615d42ea1 [NOT DOMAIN JOINED]
下列範例會查詢平板計算機輸入服務的觸發程式設定,其設定為在具有 GUID 的 HID 裝置 {4d1e55b2-f16f-11cf-88cb-001111000030} 和任何指定的 HID 裝置標識碼送達時啟動。
C:\>sc qtriggerinfo tabletinputservice
[SC] QueryServiceConfig2 SUCCESS
SERVICE_NAME: tabletinputservice
START SERVICE
DEVICE INTERFACE ARRIVAL : 4d1e55b2-f16f-11cf-88cb-001111000030 [INTERFACE CLASS GUID]
DATA : HID_DEVICE_UP:000D_U:0001
DATA : HID_DEVICE_UP:000D_U:0002
DATA : HID_DEVICE_UP:000D_U:0003
DATA : HID_DEVICE_UP:000D_U:0004