Inicio del servicio

Para iniciar un servicio o un servicio de controlador, el programa de control de servicio usa la función StartService . Se produce un error en la función StartService si la base de datos está bloqueada. Si esto ocurre, el programa de control de servicio debe esperar unos segundos y llamar a StartService de nuevo. Puede comprobar el estado de bloqueo actual de la base de datos llamando a la función QueryServiceLockStatus .

Si el programa de control de servicio inicia un servicio, puede usar la función StartService para especificar una matriz de argumentos que se pasarán a la función ServiceMain del servicio. La función StartService devuelve después de crear un subproceso nuevo para ejecutar la función ServiceMain . El programa de control de servicio puede recuperar el estado del servicio recién iniciado en una estructura de SERVICE_STATUS llamando a la función QueryServiceStatus . Durante la inicialización, el miembro dwCurrentState debe ser SERVICE_START_PENDING. El miembro dwWaitHint es un intervalo de tiempo, en milisegundos, que indica cuánto tiempo debe esperar el programa de control de servicio antes de llamar a QueryServiceStatus de nuevo. Una vez completada la inicialización, el servicio cambia dwCurrentState a SERVICE_RUNNING.

El administrador de control de servicio no admite pasar variables de entorno personalizadas a un servicio en el inicio. Además, el administrador de control de servicios no detecta ni pasa los cambios a las variables de entorno a medida que se ejecuta el servicio. En lugar de hacer que un servicio dependa de una variable de entorno, use valores del Registro o argumentos ServiceMain .

A continuación se muestra una introducción simplificada de lo que sucede cuando el administrador de control de servicios inicia un servicio típico:

  • El SCM lee la ruta de acceso del servicio del Registro y se prepara para iniciar el servicio. Esto incluye la adquisición del bloqueo de servicio. Cualquier intento de iniciar otro servicio mientras se mantiene el bloqueo del servicio se bloqueará hasta que se libere el bloqueo del servicio.
  • El SCM inicia el proceso y espera hasta que el proceso secundario salga (lo que indica un error) o notifique el estado SERVICE_RUNNING.
  • La aplicación realiza su inicialización muy sencilla y llama a la función StartServiceCtrlDispatcher .
  • StartServiceCtrlDispatcher se conecta al administrador de controles de servicio e inicia un segundo subproceso que llama a la función ServiceMain para el servicio. ServiceMain debe notificar SERVICE_RUNNING lo antes posible.
  • Cuando se notifica al administrador de control de servicios que el servicio se está ejecutando, libera el bloqueo del servicio.

Si el servicio no actualiza su estado en un plazo de 80 segundos, además de la última sugerencia de espera, el administrador de control de servicio determina que el servicio ha dejado de responder. El administrador de control de servicio registrará un evento y detendrá el servicio.

Si el programa inicia un servicio de controlador, StartService vuelve después de que el controlador de dispositivo haya completado su inicialización.

Para obtener más información, consulte Inicio de un servicio.