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 lpServiceArgVectors .

[in] lpServiceArgVectors

Las cadenas de argumento terminadas en null que se pasan al servicio mediante la llamada a la función StartService que inició el servicio. Si no hay argumentos, este parámetro puede ser NULL. De lo contrario, el primer argumento (lpServiceArgVectors[0]) es el nombre del servicio, seguido de cualquier argumento adicional (lpServiceArgVectors[1] a lpServiceArgVectors[dwNumServicesArgs-1]).

Si el usuario inicia un servicio manual mediante el complemento Servicios desde el Panel de control, las cadenas del parámetro lpServiceArgVectors proceden del cuadro de diálogo de propiedades del servicio (desde el complemento Servicios, haga clic con el botón derecho en la entrada de servicio, haga clic en Propiedades y escriba los parámetros en Parámetros de inicio).

Valor devuelto

None

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 StartServiceCtrlDispatcher con un puntero a una matriz de estructuras SERVICE_TABLE_ENTRY . A continuación, el administrador de control de servicio envía una solicitud de inicio al distribuidor de control de servicio para este proceso de servicio. El distribuidor de control de servicio crea un subproceso para ejecutar la función ServiceMain del servicio que se está iniciando.

La función ServiceMain debe llamar inmediatamente a la función RegisterServiceCtrlHandlerEx para especificar una función HandlerEx para controlar las solicitudes de control. A continuación, debe llamar a la función SetServiceStatus para enviar información de estado al administrador de control de servicio. Después de estas llamadas, la función debe completar la inicialización del servicio. No intente iniciar otro servicio en la función ServiceMain .

Service Control Manager (SCM) espera hasta que el servicio notifica 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 la interacción con el SCM, ya sea 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 notifica 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 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 llama a ServiceMain de nuevo. 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 Convenciones para prototipos de función.

Requisitos

Requisito Value
Cliente mínimo compatible Windows XP [solo aplicaciones de escritorio]
Servidor mínimo compatible Windows Server 2003 [solo aplicaciones de escritorio]
Plataforma de destino Windows
Encabezado winsvc.h (incluye Windows.h)

Consulte también

HandlerEx

RegisterServiceCtrlHandlerEx

RegisterWaitForSingleObject

SERVICE_TABLE_ENTRY

Funciones de servicio

Service ServiceMain (Función)

SetServiceStatus

StartServiceCtrlDispatcher