WEB开发网
开发学院软件开发VC 编写有图形界面的 Windows 服务程序 阅读

编写有图形界面的 Windows 服务程序

 2007-03-17 22:00:17 来源:WEB开发网   
核心提示: 注释掉CServiceModule::Init中“CComModule::Init(p, h, plibid);”一行,注释_tWinMain函数(技巧:用#if 0和#endif注释),编写有图形界面的 Windows 服务程序(5),现在编译程序,应该没有错误了

注释掉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。

上一页  1 2 3 4 5 

Tags:编写 图形 界面

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接