该服务未及时响应启动或控制请求

时间:2010-08-27 08:44:17

标签: c++ winapi service

我在win32,c ++中创建了一个服务。我能够创建服务,但是当我尝试启动它时,会出现以下错误。

[SC] StartService FAILED 1053: 该服务未及时响应启动或控制请求。

找到根本原因的最佳方法是什么,因为此错误消息没有传达任何有意义的信息

5 个答案:

答案 0 :(得分:3)

调试服务很难。这些天我更喜欢编写一个完成所有工作的类库,一个只调用类库的一个方法的服务,以及一个调用相同方法的测试工具(通常是一个控制台应用程序)。这样我就可以在调试器中运行测试工具,并将大部分错误排除在外。

当您的服务无法启动时,您倾向于获得的两条消息是您刚刚获得的消息以及“它已启动但随后停止”的消息,这通常意味着它会抛出异常。如果您正在写一个“醒来,看看它是否已经是午夜了”,那么您的通常意味着一个糟糕的循环或过长的睡眠。但实际上,在测试工具的调试器下运行它是了解正在发生的事情的最佳方式。

答案 1 :(得分:3)

这篇文章是很久以前的事了,但是我正在为未来寻找解决方法的程序员写这篇文章。

我遇到了同样的问题,花了几个小时搞清楚是什么问题。

错误消息:

  

服务没有....

在尝试运行您的服务后立即返回传递给StartServiceCtrlDispatcherWSERVICE_TABLE_ENTRY的主要功能时,可能会导致

除非SC告诉它停止,否则不应返回SC运行的主要功能。

代码如下:

void CServiceManager::Start(DWORD _dwArgc, LPWSTR * _argv)
{
    // Your performing code.
    // ....

    ::SetServiceStatus(SERVICE_RUNNING); // Roughly

    // Prevent CServiceManager::Start from returning.
    ::WaitForSingleObject(YourExitEvent, 0); 
}

此外,您不应忘记在退出代码中传递SERVICE_STOPPPED并调用SetEvent

答案 2 :(得分:1)

请注意,如果在启动服务时执行长时间操作,则错误可能来自该操作。 SC等待30秒以完成启动操作,然后报告失败。

答案 3 :(得分:0)

获得根本原因的最佳方法是检查SERVICE_STATUS_PROCESS.dwCheckPoint值。您的服务正在更新状态,当它处于START_PENDING状态时,您可以使用sc query从命令行进行轮询。

答案 4 :(得分:0)

当我使用原始MinGW(旧版)编译​​Windows服务时,我遇到了这个问题。 只需切换到最新的MinGW-64

即可解决问题 编辑:原来这只是服务找不到所需的mingw DLL的问题。使用-static标志进行编译也解决了问题