编写有图形界面的 Windows 服务程序
2007-03-17 22:00:17 来源:WEB开发网核心提示: 说到这里,就涉及到我们自己编写的代码了,编写有图形界面的 Windows 服务程序(4),比如现在我们已经建立了一个MFC的程序,想让它成为一个服务程序,这里我们删除RegisterServer,UnregisterServer两个函数,那要怎么做呢?我现在建立一个MFC EXE的项目mf
说到这里,就涉及到我们自己编写的代码了。
比如现在我们已经建立了一个MFC的程序,想让它成为一个服务程序,那要怎么做呢?
我现在建立一个MFC EXE的项目mfc1,基于对话框。那么把它变为一个服务程序的最简单的方法就是把CServiceModule给拿过来使用。因为我们已经看到CServiceModule类已经把安装服务,卸载服务,运行服务这些操作封装得很好。
打开test1的stdafx.h文件,复制CServiceModule的声明及相关头文件和变量到mfc1的stdafx.h中。
然后是把test1的test1.cpp中对CServiceModule类的实现,复制到mfc1中的mfc1.cpp中。
在stdafx.h中CServiceModule类声明前加上#include <winsvc.h>,它里面是对结构体SERVICE_STATUS_HANDLE的声明。
编译后出现以下类似错误:
D:vc6_testmfc1mfc1.cpp(52) : error C2065: ''IDR_Test1'' : undeclared identifier
D:vc6_testmfc1mfc1.cpp(336) : error C2065: ''CoInitializeSecurity'' : undeclared identifier
D:vc6_testmfc1mfc1.cpp(337) : error C2065: ''EOAC_NONE'' : undeclared identifier
D:vc6_testmfc1mfc1.cpp(362) : error C2065: ''IDS_SERVICENAME'' : undeclared identifier
D:vc6_testmfc1mfc1.cpp(362) : error C2065: ''LIBID_TEST1Lib'' : undeclared identifier
我们可以在test1中找到IDR_Test1的声明,放到mfc1中,解决第一条错误。但我们也可以去掉CServiceModule中与COM有关的一些代码。这里我们删除RegisterServer,UnregisterServer两个函数,并让Run函数成为
void CServiceModule::Run()
{
_Module.dwThreadID = GetCurrentThreadId();
LogEvent(_T("Service started"));
if (m_bService)
SetServiceStatus(SERVICE_RUNNING);
MSG msg;
while (GetMessage(&msg, 0, 0, 0))
DispatchMessage(&msg);
}
增加资源IDS_SERVICENAME为“mfc1”。
更多精彩
赞助商链接