win32 varias tutorial setup que programming programación programacion interfaz funciones aplicaciones windows winapi windows-services

varias - windows programming



¿Qué causa que StartServiceCtrlDispatcher() falle con 1063(ERROR_FAILED_SERVICE_CONTROLLER_CONNECT)? (2)

Estoy viendo un extraño error con mi programa de servicio de Windows. Mi programa de servicio llama a StartServiceCtrlDispatcher() al principio de su main() , pero a veces falla con 1063 (ERROR_FAILED_SERVICE_CONTROLLER_CONNECT) .

Sé que este error ocurre si el usuario inicia el programa manualmente (como un programa de consola). Pero, no es el caso. Agregué un código para verificar el proceso principal del programa de servicio cuando ocurre este error, y le dice a services.exe que es el proceso principal (creo que es seguro suponer que SCM inició correctamente mi programa).

Lamentablemente, este error no se reproduce en mi máquina de desarrollo y no puedo depurarlo solo, pero los registros de errores capturados en los sistemas de usuario dicen:

  • Este problema parece ocurrir solo en un pequeño% de todos los usuarios de este programa.
  • Incluso si el problema ocurre, parece que no se repite. La próxima vez el servicio generalmente comienza exitosamente.
  • Cuando ocurre este problema, StartServiceCtrlDispatcher() detiene durante aproximadamente un segundo antes de que vuelva con error.

¿Alguien ha visto un error similar? Si es así, ¿cuál fue la causa del error?


Como ya puede ver por la ausencia de respuestas y cualquier cosa en google, el problema no es común. Creo que el problema está en su servicio, Y está en el código ejecutado desde el inicio del proceso en StartServiceCtrlDispatcher() , Y lo más probable es que tome algún tipo de corrupción de recursos del sistema, probablemente del montón o de HANDLE .

Puede lamentarlo, pero no voy a tener una respuesta mágica para sus problemas. En cambio, puedo sugerir algunos problemas.

Microsoft Application Verifier es invaluable para encontrar corrupción. Te sugiero que:

  1. Instálalo en tu máquina de desarrollo.
  2. Agregue el exe de su servicio.
  3. Solo seleccione Basics/Heaps por primera vez.
  4. Presione Guardar. No importa si mantiene abierto el verificador de aplicaciones.
  5. Ejecute su servicio algunas veces.
  6. Si se bloquea, elimínelo y el bloqueo apuntará a su problema.
  7. Si no falla, agregue Basics/Handles . A diferencia de Basics/Heaps , esto a veces puede generar "falsos positivos", errores en el código que no duelen demasiado. De todos modos, ya que estás en la búsqueda, será mejor que arregles todo lo que puedas encontrar. Me preocupa sobre todo liberar doble HANDLE o algo así. Liberar a un MANIPULADOR del gerente de servicio por error seguramente puede llevar a su problema.
  8. Si todavía no falla, puede probar otras opciones en Basics/* , pero no creo que eso ayude.
  9. En este punto, es posible que desee inspeccionar el código entre main() y StartServiceCtrlDispatcher() y cualquier constructor global que pueda tener. Busque posibles desbordamientos y errores de búfer con HANDLE ''s.
  10. El siguiente paso podría ser instalar Application Verifier en la máquina del cliente. No hay mucho daño, a veces lo hago cuando no puedo encontrar el error yo mismo.

SUGERENCIA: utilicé _wfopen / fwrite / fclose para registrar algunos mensajes. De alguna manera, 183 fueron arrojados internamente y estaban conduciendo a esta falla 1063. Eliminé el registro y comenzó a funcionar normalmente como no pasó nada. Cualquier minuto de error puede llevarte a eso. Comience desde los servicios y mostrará el error de salario (183 en mi caso).