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

來源:互聯網
上載者:User

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

現在我們還剩下一個函數可以在細節上討論,那就是服務的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,單位是毫秒。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.