编写有图形界面的 Windows 服务程序
2007-03-17 22:00:17 来源:WEB开发网注释掉CServiceModule::Init中“CComModule::Init(p, h, plibid);”一行。
注释_tWinMain函数(技巧:用#if 0和#endif注释)。
现在编译程序,应该没有错误了,但加入的CServiceModule还没有起到作用。
在mfc1中的IDD_MFC1_DIALOG上加入两个按钮,分别是“安装服务”,“卸载服务”。增加的单击事件代码为:
“安装服务”按钮:void CMfc1Dlg::OnButton1() { _Module.Install(); }
“卸载服务”按钮:void CMfc1Dlg::OnButton2() { _Module.Uninstall(); }
下面在CMfc1App::InitInstance()中加入一些代码:
_Module.Init(ObjectMap, this->m_hInstance, IDS_SERVICENAME, NULL);
_Module.m_bService = TRUE;
_Module.Start();
地点是在原来产生对话框的代码的地方。而原有的生成对话框的代码转移到Run()中,位置是在使用了SetServiceStatus函数设置服务状态之后,并注释掉其后的消息处理代码,因对话框自身有消息处理机制。
编译时若出现如下错误,将Install()和Uninstall()前的inline参数去掉即可:
mfc1Dlg.obj : error LNK2001: unresolved external symbol "public: int __thiscall CServiceModule::Install(void)" (?Install@CServiceModule@@QAEHXZ)
mfc1Dlg.obj : error LNK2001: unresolved external symbol "public: int __thiscall CServiceModule::Uninstall(void)" (?Uninstall@CServiceModule@@QAEHXZ)
现在可以编译运行了。然后点击“安装服务”,就可以在服务列表中看到mfc1了。
四、这一服务程序运行时没有图形界面?
不错,刚才直接运行mfc1.exe时我们看到了图形界面,但在服务列表中用右键菜单中的“启动”时却看不到任何界面。这该怎么办?
我们还需要在使用CreateService函数时(Install()中),加上一个参数,这样才能允许程序与桌面交互,也就是可以显示界面。这个参数是SERVICE_INTERACTIVE_PROCESS。
填加后的CreateService:
SC_HANDLE hService = ::CreateService(
hSCM, m_szServiceName, m_szServiceName,
SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS,
SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,
szFilePath, NULL, NULL, _T("RPCSS"), NULL, NULL);
再次编译mfc1,卸载服务后,安装服务。我们可以看到,通过服务列表启动mfc1,原有的对话框出现了。如需将服务设为自动启动,则将 SERVICE_DEMAND_START 改为 SERVICE_AUTO_START。
更多精彩
赞助商链接