LPSERVICE_MAIN_FUNCTIONA función de devolución de llamada (winsvc.h)
Punto de entrada de un servicio.
El tipo LPSERVICE_MAIN_FUNCTION define un puntero a esta función de devolución de llamada. ServiceMain es un marcador de posición para un nombre de función definido por la aplicación.
Sintaxis
LPSERVICE_MAIN_FUNCTIONA LpserviceMainFunctiona;
void LpserviceMainFunctiona(
[in] DWORD dwNumServicesArgs,
[in] LPSTR *lpServiceArgVectors
)
{...}
Parámetros
[in] dwNumServicesArgs
Número de argumentos de la matriz de lpServiceArgVectors.
[in] lpServiceArgVectors
Las cadenas de argumento terminadas en null que se pasan al servicio mediante la llamada a la función startService
Si el usuario inicia un servicio manual mediante el complemento Servicios desde el Panel de control, las cadenas del parámetro lpServiceArgVectors
Valor devuelto
Ninguno
Observaciones
Un programa de servicio puede iniciar uno o varios servicios. Un proceso de servicio tiene una estructura SERVICE_TABLE_ENTRY para cada servicio que puede iniciar. La estructura especifica el nombre del servicio y un puntero a la función ServiceMain para ese servicio.
Cuando el administrador de control de servicios recibe una solicitud para iniciar un servicio, inicia el proceso de servicio (si aún no se está ejecutando). El subproceso principal del proceso de servicio llama a la función
La función
Service Control Manager (SCM) espera hasta que el servicio notifique un estado de SERVICE_RUNNING. Se recomienda que el servicio notifique este estado lo antes posible, ya que otros componentes del sistema que requieren interacción con SCM se bloquearán durante este tiempo. Algunas funciones pueden requerir interacción con el SCM directa o indirectamente.
El SCM bloquea la base de datos de control de servicio durante la inicialización, por lo que si un servicio intenta llamar a StartService durante la inicialización, la llamada se bloqueará. Cuando el servicio informa al SCM que se ha iniciado correctamente, puede llamar a StartService. Si el servicio requiere que se ejecute otro servicio, el servicio debe establecer las dependencias necesarias.
Además, no debe llamar a ninguna función del sistema durante la inicialización del servicio. El código de servicio debe llamar a las funciones del sistema solo después de que notifique un estado de SERVICE_RUNNING.
La función ServiceMain debe crear un evento global, llamar a la función RegisterWaitForSingleObject en este evento y salir. Esto finalizará el subproceso que ejecuta la función ServiceMain, pero no finalizará el servicio. Cuando el servicio se detiene, el controlador de control de servicio debe llamar a setServiceStatus con SERVICE_STOP_PENDING y indicar este evento. Un subproceso del grupo de subprocesos ejecutará la función de devolución de llamada de espera; esta función debe realizar tareas de limpieza, incluido el cierre del evento global y llamar a setServiceStatus con SERVICE_STOPPED. Una vez detenido el servicio, no debe ejecutar ningún código de servicio adicional porque puede introducir una condición de carrera si el servicio recibe un control de inicio y se vuelve a llamar ServiceMain. Tenga en cuenta que es más probable que se produzca este problema cuando varios servicios comparten un proceso.
Ejemplos
Para obtener un ejemplo, consulte Escritura de una función ServiceMain.
Nota
El encabezado winsvc.h define LPSERVICE_MAIN_FUNCTION como alias que selecciona automáticamente la versión ANSI o Unicode de esta función en función de la definición de la constante de preprocesador UNICODE. La combinación del uso del alias neutral de codificación con código que no es neutral de codificación puede dar lugar a errores de coincidencia que dan lugar a errores de compilación o tiempo de ejecución. Para obtener más información, vea Conventions for Function Prototypes.
Requisitos
Requisito | Valor |
---|---|
cliente mínimo admitido | Windows XP [solo aplicaciones de escritorio] |
servidor mínimo admitido | Windows Server 2003 [solo aplicaciones de escritorio] |
de la plataforma de destino de |
Windows |
encabezado de |
winsvc.h (incluya Windows.h) |
Consulte también
de la función ServiceMain del servicio de