我有一个C++编写的Windows服务,在启动时,如果SERVICE_STATUS停留在SERVICE_START_PENDING中太长时间,我就会出现以下错误:
Error 1053: The service did not respond to the start or control request in a timely fashion
当保持打开进度栏对话框时会发生这种情况。它不影响服务启动本身。该服务将在SERVICE_START_PENDING中继续进行,直到工作完成并设置为SERVICE_RUNNING为止。
dwWaitHint上的Windows文档如下:
https://msdn.microsoft.com/en-us/library/windows/desktop/ms685996(v=vs.85).aspx
在SetServiceStatus时间过去之前,服务必须使用递增的dwCheckPoint调用dwWaitHint。
例如,我将dwWaitHint设置为5分钟,每10秒用一个递增的dwCheckPoint调用SetServiceStatus,但5分钟后仍然会得到1053错误。换句话说,SetServiceStatus调用似乎什么都不做。(这些电话没有失败,我查过了)。
通过以上操作,服务启动时间不能超过dwWaitHint吗?
更新:我可以使用Microsoft的服务示例代码进行复制。这是一段片段。
{
gSvcStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
gSvcStatus.dwServiceSpecificExitCode = 0;
// Report initial status to the SCM
ReportSvcStatus( SERVICE_START_PENDING, NO_ERROR, 300000 );
int limit = 6; // 6 minutes total
while(limit--)
{
Sleep(60000); // sleep 1 min
ReportSvcStatus( SERVICE_START_PENDING, NO_ERROR, 300000 ); // 5 minute dwWaitHint
}
// We've completed startup, report RUNNING to SCM
ReportSvcStatus( SERVICE_RUNNING, NO_ERROR, 0 );}
VOID ReportSvcStatus( DWORD dwCurrentState, DWORD dwWin32ExitCode, DWORD dwWaitHint)
{
static DWORD dwCheckPoint = 1;
// Fill in the SERVICE_STATUS structure.
gSvcStatus.dwCurrentState = dwCurrentState;
gSvcStatus.dwWin32ExitCode = dwWin32ExitCode;
gSvcStatus.dwWaitHint = dwWaitHint;
if (dwCurrentState == SERVICE_START_PENDING)
gSvcStatus.dwControlsAccepted = 0;
else gSvcStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;
if ( (dwCurrentState == SERVICE_RUNNING) ||
(dwCurrentState == SERVICE_STOPPED) )
gSvcStatus.dwCheckPoint = 0;
else gSvcStatus.dwCheckPoint = dwCheckPoint++;
// Report the status of the service to the SCM.
SetServiceStatus( gSvcStatusHandle, &gSvcStatus );
}发布于 2017-12-15 15:50:01
Microsoft管理控制台(MMC)服务插件有一定的限制,特别是这里的对话框:

请参阅MS的以下链接:
https://support.microsoft.com/en-ca/help/307806/the-services-snap-in-times-out-with-error-1053
启动任何控制操作时,“服务管理单元”将显示标题为“服务控制”的进度对话框。如果服务需要大量时间来处理操作,则进度条将随着服务插件等待操作完成而缓慢增加。125秒后,进度条将满,服务插件将显示错误1053 (ERROR_SERVICE_REQUEST_TIMEOUT)消息。即使在出现错误消息之后,服务流程本身仍将像往常一样继续其操作。
但是,有一点好消息是,我已经证明了这125秒语句是错误的,至少在Windows 10上是这样(还没有尝试其他Windows版本)。正如我在问题中所述,在设置SERVICE_START_PENDING时,可以将dwWaitHint设置为更高的值,而进度条将尊重这一点。但是,您只有1次机会,如果然后通过使用更高的SERVICE_START_PENDING调用SetServiceStatus来更新dwWaitHint,则不会影响进度条对话框。
设置dwWaitHint的唯一缺点是进度条会减慢,当您设置SERVICE_RUNNING状态时,进度条可能只是一半。但不是什么大事,只是审美而已。
发布于 2017-12-13 18:08:31
你确定你把dwWaitHint当作毫秒而不是秒?(也就是说你的dwWaitHint是300000?)
我的经验是,文档在这一点上是正确的,等待提示只适用于下一个SetServiceStatus调用。
尽管我也会说5分钟的服务启动时间太长了,即使加载或检查数据实际上要花那么长的时间。我之所以这么说,主要是因为服务控制接口一直被卡住。例如,即使在需要几个小时验证的系统崩溃之后,SQLServer也能相当快地启动服务。
https://stackoverflow.com/questions/47797296
复制相似问题