windows服務+托盤控制程序

最近寫windows服務需要有界面交互,反覆查閱資料發現windows服務中是無法做界面彈出的。
最後敲定方案爲:windows服務+子進程 的控制方式,其中windows服務中運行服務處理事務,在子進程中彈出界面進行交互操作,界面進程由服務進行創建,並隨服務停止而消亡。

其中有幾個技術要點,在這裏做下簡單記錄(其中系統托盤的創建依賴於窗口,使用比較簡單,在這裏不再贅述):
1.創建需要同界面交互的進程時,調用CreateService要包含SERVICE_INTERACTIVE_PROCESS參數(在windows服務屬性中對應“允許服務於桌面交互”)。
2.在服務中啓動子進程時,使用CreateProcessAsUser接口;
3.服務進程和界面進程交互時比較複雜,這裏選用共享內存的方式,注意共享內存要在子進程中創建(CreateFileMapping),在服務中做打開操作(OpenFileMapping),並且共享內存的名字一定要添加“Global”前綴。
4.進程間同步訪問共享內存時使用互斥量進行互鎖,同樣互斥量要由子進程創建(CreateMutex),在服務中做打開操作(OpenMutex),並且互斥量的名字一定要添加“Global”前綴。

使用時,測試發現在服務中創建的共享內存,普通進程是無論如何也訪問不到的,即使添加“Global”前綴也無濟於事,兩者使用相同的名字創建時返回的內存地址是不同的;而只有在普通進程中創建帶“Global”前綴的共享內存,服務纔可以訪問的到。估計windows在處理這些內核對象時,服務和普通進程資源是相互隔離的,即使名字相同,二者的資源也無法相互訪問,只有在普通進程中使用“Global”前綴時,這些資源對服務而言纔可見。

附代碼鏈接:windows服務+托盤控制程序

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章