是什么导致Star​​tServiceCtrlDispatcher()失败,并返回1063(ERROR_FAILED_SERVICE_CONTROLLER_CONNECT)?

我看到我的Windows服务程序奇怪的错误。 我的服务程序在main()的最开始处调用StartServiceCtrlDispatcher() ,但有时会失败,并返回1063 (ERROR_FAILED_SERVICE_CONTROLLER_CONNECT)

我知道如果用户手动启动程序(作为控制台程序),则会发生此错误。 但事实并非如此。 我添加了一个代码来检查服务程序的父进程,当这个错误发生时,它告诉services.exe是父进程(我认为可以安全地假设我的程序是由SCM正确启动的)。

不幸的是,这个错误不能在我的开发机器上重现,并且不能自己debugging,但是在用户系统上捕获的错误日志告诉:

  • 这个问题似乎只发生在这个程序的所有用户的几个百分比上。
  • 即使问题发生了,似乎也没有重复。 下一次服务通常成功启动。
  • 当这个问题发生时, StartServiceCtrlDispatcher()在返回失败前暂停大约一秒。

有没有人看过类似的错误? 如果是这样,错误的原因是什么?

正如你已经看到从谷歌没有答案和任何东西,这个问题并不常见。 我相信这个问题是在你的服务中,而且是在从StartServiceCtrlDispatcher()开始的过程中执行的代码,最有可能的是它需要某种形式的破坏系统资源,可能是堆或HANDLE

听到这个,你可能会感到抱歉,但是我不会对你的问题有个神奇的答案。 相反,我可以提出一些疑难解答。

Microsoft应用程序验证程序在查找损坏方面非常重要。 我建议你:

  1. 安装到您的开发机器。
  2. 添加你的服务的exe文件。
  3. 只有第一次选择Basics\Heaps
  4. 按保存。 如果您保持应用程序验证器打开,则无关紧要。
  5. 运行您的服务几次。
  6. 如果崩溃,调试它,崩溃将指向你的问题。
  7. 如果不会崩溃,请添加Basics\Handles 。 与Basics\Heaps不同,这有时会Basics\Heaps “误报” – 代码中的错误不会造成太大的伤害。 无论如何,既然你在追捕,你最好修好一切你能找到的东西。 我最担心的是释放一个HANDLE或类似的东西。 释放服务管理器的HANDLE肯定会导致你的问题。
  8. 如果它仍然没有崩溃,您可以尝试Basics\*其他选项,但我不认为这会有所帮助。
  9. 此时,您可能需要检查程序的main()StartServiceCtrlDispatcher()之间的代码以及您可以拥有的全局构造函数。 寻找潜在的缓冲区溢出和HANDLE的错误。
  10. 下一步可能是将Application Verifier安装到客户机器上。 没有多大的伤害,有时我自己也找不到这个错误。

提示:我用_wfopen / fwrite / fclose记录了一些消息。 不知怎的,183被内部抛出,并导致这个失败1063.我删除了日志记录,并开始正常工作,因为什么也没有发生。 任何微小的错误都可能导致你。 从服务开始,它会列出工资错误(在我的情况下为183)。