编写一个带管理界面(对话框)的windows后台服务程序 2007-03-06 13:17
这个程序是一个自身带有管理、配置界面的后台服务,当然也可以作为前台普通程序来使用,其实就是在一个写好的前台程序里添加了后台服务模块,使其既能由后台启动,也能双击运行。
这样做增加了程序的设计难度,减弱了程序的模块化,日后扩展修改可能有些麻烦。不过这也有几个明显的好处:
1、 最大程度利用了已经写好的前台程序,不用再另外开发配置工具
2、 程序代码在一个工程里,便于修改、调试,不需要同步代码
3、 后台服务中也可添加对话框,用于更加细致的了解程序的运行状态(本服务没有做这部分,但添加这块也很容易)
整个程序的架构示意图:
此图片过两天再添加
程序架构示意图
开发步骤及流程:
1、开发好前台程序
2、参考《编写有图形界面的 Windows 服务程序》(http://www.vckbase.com/document/viewdoc/?id=1738)这篇文章生成CServiceModule类,将其单独写一个文件,并加入到工程里。
3、 在void CServiceModule::Start()函数中,
if (m_bService && !::StartServiceCtrlDispatcher(st)) //判断是否是后台服务方式启动
{
m_bService = FALSE;
}
if (m_bService == FALSE)
UnServiceRun(); //前台方式启动则执行这个函数,原来是Run()。后台方式系统会自动调用ServiceMain()函数,而ServiceMain()中会调用Run();
这样就可以在Run()中写后台服务所要执行的程序,在UnServiceRun()中写前台方式启动时要执行的代码,可以在此调用前台的那个对话框,并传入自身的指针。把全部的对底层的操作全部封装在CServiceModule类中,而对话框类则调用CServiceModule类中的方法。这样即使不安装后台服务,照样可以完成工作,并最大限度的使代码所走的路径相同,便于以后调试。
4、不要将Run()中的消息处理代码注掉,否则Run执行完后后台服务后也就要退出了。可以在Handler()里面添加消息的响应代码(前台启动时是不会执行Handler的)
MSG msg;
while (GetMessage(&msg, 0, 0, 0))
DispatchMessage(&msg);
5、在前台管理界面上添加“安装、卸载、启动、停止后台服务”的代码
这样,服务大体上就完成了,最后的程序就一个exe,从后台服务运行和双击运行执行的是同一个exe,但是两个不同进程,走的是不同的代码,这一点一定要分清楚。如果有资源两者都要访问,如文件,则要设好临界区。可以在后台服务启动时也弹出对话框(Run函数中),从而可以实现监控服务运行状态等其他功能。