标签:
主要是根据从www.vcbase.com上看到的一篇文章来做这个windows服务的。但是这篇文章一些关键代码并没有贴出来,然而有心人根据作者的描述实现了代码,并且完整的贴了出来,地址是在 http://www.2cto.com/kf/201111/111990.html
我创建的是一个空项目,这个默认的应该是控制台项目。服务的主函数是main而不是winmain,要写一个服务首先要初始化一个SERVICE_TABLE_ENTRY 分派表结构体的列表,然后调用StartServiceCtrlDispatcher();这将把调用进程的主线程转换为控制分派器。该分派器启动一个新线程,该线程运行分派表中对应于你的服务的ServiceMain()函数。在这之后系统将自动创建一个线程去执行ServiceMain函数的内容,你应该将你要执行的任务在ServiceMain中循环,这样服务就开始运行了。
ServiceMain函数为void WINAPI ServiceMain(int argc, char** argv)格式的函数在ServiceMain执行你的任务前,需要给SERVICE_TABLE_ENTRY 分派表结构体进行赋值,注意由于此时服务还没有开始执行你的任务所以我们将服务的状态设置为SERVICE_START_PENDING,即正在初始化,然后注册控制处理函数hstatus = ::RegisterServiceCtrlHandler("SCProgressLog", CtrlHandler);最后一个参数是一个函数,函数的作用是根据不同的命令,对控制循环的变量进行操作,从而操作进程循环。然后servicestatus.dwCurrentState = SERVICE_RUNNING;SetServiceStatus (hstatus, &servicestatus);向控制线程发送运行状态,接下来就是功能实现的循环了。
另外需要注意的是,将程序加入服务,可以用cmd命令,或者批处理sc create scname binpath= D:\test.exe
注意,等号后面必须有空格。sc start scname --启动服务
标签:
原文地址:http://www.cnblogs.com/yunbuyi/p/4906199.html