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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值