Search Google

Monday, July 28, 2008

Create Native Windows Service In C -- supplementary

我在上個星期五花了一點篇幅紀錄目前研究windows service的進度1,今天下午測試後發現有些功能完全沒有作用,經過google的幫忙後在CodeProject上找到一篇不錯的tutorial2,文中剛好講到我之前疏忽的重點:

我們利用RegisterServiceCtrlHandlerEx函式註冊service control handler時所輸入的第二個參數正影響著handler的prototype。

若是將handler cast成為(LPHANDLER_FUNCTION_EX)則handler的prototype將會是:
handler(DWORD dwOpcode,DWORD evtype, PVOID evdata, PVOID Context);

若是將handler cast成為(LPHANDLER_FUNCTION)則handler的prototype就會變成:
handler(DWORD dwOpcode;


至於要將handler cast成上述的哪一種,端看這支程式/service的功用為何。
如果只是想要執行簡單的控制然後在start, stop, pause, continue service的時候改變控制行為,那麼將handler cast成
(LPHANDLER_FUNCTION)即可,若是想要控制usb(舉例)勢必需要更多的資訊才能知道usb的狀態,因此就必須將handler cast成(LPHANDLER_FUNCTION_EX)。

有心人如果翻翻我上星期五貼出來的範例就會發現我在註冊service control handler的時候只有將handler cast成(LPHANDLER_FUNCTION)卻肖想handler的prototype為:
void ControlHandler(DWORD request, DWORD evtype, PVOID evdata, PVOID Context);
這麼一來,有功能沒有作用是再正常不過的事了!

以上仍為嘴泡理論,等我有時間測試的時候再來確認一下,如果到時候發現嘴泡有誤再上來訂正 ^^



1 Create Native Windows Service In C
2 http://www.codeproject.com/KB/system/Windows_Services.aspx

No comments: