windows服务编写

windows服务编写

以前贴过windows服务编写的代码,这次主要是再来缕一缕windows服务的编写。

编写服务的过程中遇到的问题就是服务在windows x86上正常运行,但是编译成x64以后在x64位机上出现服务无响应的错误。(目前确认位代码中包含cout造成的,原因未知)

windows服务是按一定的结构编写的,主要的模块是InitService(),ControlHandler(DWORD request),ServiceMain(int argc, char** argv),以及main()函数。

首先看主函数main(),在这个函数中我们主要完成创建一个分派表,并启动服务控制分派表(使用StartServiceCtrlDispatcher函数)。服务控制分派表的作用是,对指定服务提供一个处理函数。除此之外,我们对服务的安装或者移除一般也是在main()函数中获取用户的参数然后进行相应的处理。


int main(int argc,CHAR* argv[])
{
if( lstrcmpi( argv[1], TEXT("install")) == 0 )
{
SvcInstall();
return 1;
}
if( lstrcmpi( argv[1], TEXT("remove")) == 0 )
{
Svcremove();
return 1;
}
//创建分派表并启动控制分派机
SERVICE_TABLE_ENTRY ServiceTable[2];
ServiceTable[0].lpServiceName = SERVICENAME;
ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;
ServiceTable[1].lpServiceName = NULL;
ServiceTable[1].lpServiceProc = NULL;
//启动服务的控制分派器线程
StartServiceCtrlDispatcher(ServiceTable);
return 0;
}

现在跟着主函数我们进入服务的处理函数ServiceMain()中去看看,MSDN上说在这个函数中首先调用RegisterServiceCtrlHandler()函数来注册控制处理器ControlHandler()函数,然后进行服务的初始化工作交给InitService()函数来做。如果这个过程出现错误需要调用SetServiceStatus()来向SCM报告服务的状态。正常运行也要向服务报告正常状态。在InitService()或者ServiceMain()中do what you want to do。

然后是ControlHandler()函数,这个函数处理SCM控制请求,根据不同的请求控制码处理并报告服务状态。控制码可以自定义(通过ControlService()发送控制码)。

eg:

停止服务  SERVICE_CONTROL_STOP

暂停服务  SERVICE_CONTROL_PAUSE

恢复被暂停的服务  SERVICE_CONTROL_CONTINUE

返回服务的更新状态信息  SERVICE_CONTROL_INTERROGATE

例子不贴了,网上一搜一大堆。




So BadJust So SoGoodCoolPretty Cool (7 人已评分, 平均分: 5.00 )
Loading...

发表评论

电子邮件地址不会被公开。 必填项已用*标注