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服务+托盘控制程序

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