程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> Windows服務編寫原理及探討(3)

Windows服務編寫原理及探討(3)

編輯:vc教程

(三)對服務的深入討論之下

現在我們還剩下一個函數可以在細節上討論,那就是服務的CtrlHandler函數。

當調用RegisterServiceCtrlHandler函數時,SCM得到並保存這個回調函數的地址。一個SCP調一個告訴SCM如何去控制服務的Win32函數,現在已經有10個預定義的控制請求:

Control code

Meaning

SERVICE_CONTROL_STOP Requests the service to stop. The hService handle must have SERVICE_STOP access. SERVICE_CONTROL_PAUSE Requests the service to pause. The hService handle must have SERVICE_PAUSE_CONTINUE access. SERVICE_CONTROL_CONTINUE Requests the paused service to resume. The hService handle must have SERVICE_PAUSE_CONTINUE access. SERVICE_CONTROL_INTERROGATE Requests the service to update immediately its current status information to the service control manager. The hService handle must have SERVICE_INTERROGATE access. SERVICE_CONTROL_SHUTDOWN Requests the service to perform cleanup tasks, because the system is shutting down. For more information, see Remarks. SERVICE_CONTROL_PARAMCHANGE Windows 2000: Requests the service to reread its startup parameters. The hService handle must have SERVICE_PAUSE_CONTINUE access. SERVICE_CONTROL_NETBINDCHANGE Windows 2000: Requests the service to update its network binding. The hService handle must have SERVICE_PAUSE_CONTINUE access. SERVICE_CONTROL_NETBINDREMOVE Windows 2000: Notifies a network service that a component for binding has been removed. The service should reread its binding information and unbind from the removed component. SERVICE_CONTROL_NETBINDENABLE Windows 2000: Notifies a network service that a disabled binding has been enabled. The service should reread its binding information and add the new binding. SERVICE_CONTROL_NETBINDDISABLE Windows 2000: Notifies a network service that one of its bindings has been disabled. The service should reread its binding information and remove the binding.

上表中標有Windows 2000字樣的就是2000中新添加的控制代碼。除了這些代碼之外,服務也可以接受用戶定義的,范圍在128-255之間的代碼。

當CtrlHandler函數收到一個SERVICE_CONTROL_STOP、SERVICE_CONTROL_PAUSE、 SERVICE_CONTROL_CONTINUE控制代碼的時候,SetServiceStatus必須被調用去確認這個代碼,並指定你認為服務處理這個狀態變化所需要的時間。

例如:你的服務收到了停止請求,首先要把SERVICE_STATUS結構的dwCurrentState成員設置成SERVICE_STOP_PENDING,這樣可以使SCM確定你已經收到了控制代碼。當一個服務的暫停或停止操作正在執行的時候,必須指定你認為這種操作所需要的時間:這是因為一個服務也許不能立即改變它的狀態,它可能必須等待一個網絡請求被完成或者數據被刷新到一個驅動器上。指定時間的方法就像我上一章說的那樣,用成員dwCheckPoint和dwWaitHint來指明它完成狀態改變所需要的時間。如果需要,可以用增加dwCheckPoint成員的值和設置dwWaitHint成員的值去指明你期待的服務到達下一步的時間的方式周期性的報告進展情況。

當整個啟動的過程完成之後,要再一次調用SetServiceStatus。這時就要把SERVICE_STATUS結構的dwCurrentState成員設置成SERVICE_STOPPED,當報告狀態代碼的同時,一定要把成員dwCheckPoint和dwWaitHint設置為0,因為服務已經完成了它的狀態變化。暫停或繼續服務的時候方法也一樣。

當CtrlHandler函數收到一個SERVICE_CONTROL_INTERROGATE控制代碼的時候,服務將簡單的將dwCurrentState成員設置成服務當前的狀態,同時,把成員dwCheckPoint和dwWaitHint設置為0,然後再調用SetServiceStatus就可以了。

在操作系統關閉的時候,CtrlHandler函數收到一個SERVICE_CONTROL_SHUTDOWN控制代碼。服務根本無須回應這個代碼,因為系統即將關閉。它將執行保存數據所需要的最小行動集,這是為了確定機器能及時關閉。缺省時系統只給很少的時間去關閉所有的服務,MSDN裡面說大概是20秒的時間,不過那可能是Windows NT 4的設置,在我的Windows 2000 Server裡這個時間是10秒,你可以手動的修改這個數值,它被記錄在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control子鍵裡面的WaitToKillServiceTimeout,單位是毫秒。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved