赞
踩
写一个Windows servicer服务程序, 尽管有现成的模式可以套用但是有几个地方还是值得注意:
1、在exe 的main 函数首先需要 声明 如下的数组:
SERVICE_TABLE_ENTRY dispatchTable[] =
{
{ TEXT(SZSERVICENAME), (LPSERVICE_MAIN_FUNCTION)service_main},
{ NULL, NULL}
};
// Install , remove 或者 debug
if (!StartServiceCtrlDispatcher(dispatchTable))
AddToMessageLog(TEXT("StartServiceCtrlDispatcher failed."));
2、在service_main里面需要注册ctrlhander函数
...
sshStatusHandle = RegisterServiceCtrlHandler( TEXT(SZSERVICENAME),service_ctrl);
//SetServiceStatus
ServiceStart( dwArgc, lpszArgv);
//SetServiceStatus
...
3、当程序进入ServiceStart模块,执行用户定义的任务代码模块后,一定要及时地多次向SCM进行状态汇报,否则SCM收不到响应;
4、当用户点击SCM管理工具的“停止”按钮,SCM将触发 SCP控制进程,系统将执行以下的响应代码:
VOID WINAPI service_ctrl(DWORD dwCtrlCode)
{
// Handle the requested control code.
//
switch (dwCtrlCode)
{
// Stop the service.
//
// SERVICE_STOP_PENDING should be reported before
// setting the Stop Event - hServerStopEvent - in
// ServiceStop(). This avoids a race condition
// which may result in a 1053 - The Service did not respond...
// error.
case SERVICE_CONTROL_STOP:
ReportStatusToSCMgr(SERVICE_STOP_PENDING, NO_ERROR, 0);
ServiceStop();
ReportStatusToSCMgr(SERVICE_STOPPED, NO_ERROR, 0);
return;
// Update the service status.
//
case SERVICE_CONTROL_INTERROGATE:
break;
// invalid control code
//
default:
break;
}
ReportStatusToSCMgr(ssStatus.dwCurrentState, NO_ERROR, 0);
}
停止过程中,进程同样需要及时向SCM汇报状态,否则,SCM接收不到状态反馈。
5、启动和停止过程中,如果SCM管理工具收不到状态反馈的话,将弹出以下提示:
运行时错误: 错误 1053: 服务没有及时响应启动或控制请求。
6、综上所述:当服务进程启动和停止的过程中,一定要及时多次地向SCM汇报状态,否则SCM无法响应。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。