用 ATL 编写 Windows 服务
2006-07-22 22:53:28 来源:WEB开发网SERVICE_DEMAND_START是手动启动,SERVICE_AUTO_START是自动启动。第十一个参数是服务的依存关系,比如说服务的启动想要依存SQL Server的启动,那我们可以把这个参数写成:
_T("MSSQLSERVER\0");
如果我们写的服务不依存于其他的任何服务,那我们就将此参数设置为NULL就可以了。
接下来,我们为上面的"什么也不做"的服务添加一个简单的功能:做数字的累加,并且把结果写到系统的"应用程序日志"中去。
首先,我们在类CServiceModule中添加一个成员变量:int n; 在Init()中对n进行初始化:
n = 0;
然后在类CServiceModule中添加一个成员函数Adder():
void CServiceModule::Adder()
{
n ++;
CString str;
str.Format("%i",n);
LogEvent(str);
}
编译…出错了。??,提示 CString 没有定义,难道在ATL中无法用 MFC 吗?让我们看看设置:菜单Project->Setting ,General面板,默认的设置是:Use MFC in a Static Library。那为什么不可以用MFC中的类呢?原来是头文件没有包含,这个不知道算不算 VC 的一个 Bug : ,设置中默认是用MFC,可是却没有包含相应的头文件。那我们就自己加上好了。在StdAfx.h中加上:#include ,注意要加到#include 的前面,要不然又要编译出错了。接下来,我们在程序中再添加一个Timer,让这个Timer每两秒钟调用一次Adder,做一次累加。在:
MSG msg;
while (GetMessage(&msg, 0, 0, 0))
DispatchMessage(&msg);
的前面加上代码:
SetTimer(NULL,1,2000,(TIMERPROC)OnTimerProc);
注意一定要加在前面,因为要是加到while循环的下面,就没有机会执行了。再添加一个全局的回调函数OnTimerProc 如下:
VOID CALLBACK OnTimerProc(HWND hwnd,UINT uMsg,UINT_PTR idEvent,DWORD dwTime)
{
_Module.Adder();
}
好了,大功告成。编译,然后在SCM中启动我们的服务。在控制面板中打开"事件查看器",看一下运行的结果,如下图四:
图四
好了,就写到这里吧,其他的内容大家自己深究吧。祝各位编程愉快!
更多精彩
赞助商链接