Compartir a través de


Función NotifyServiceStatusChangeA (winsvc.h)

Permite a una aplicación recibir notificaciones cuando se crea o elimina el servicio especificado o cuando cambia su estado.

Sintaxis

DWORD NotifyServiceStatusChangeA(
  [in] SC_HANDLE        hService,
  [in] DWORD            dwNotifyMask,
  [in] PSERVICE_NOTIFYA pNotifyBuffer
);

Parámetros

[in] hService

Identificador del servicio o del administrador de control de servicios. Los identificadores de los servicios los devuelve la función OpenService o CreateService y deben tener el derecho de acceso SERVICE_QUERY_STATUS. La función OpenSCManager devuelve los identificadores del administrador de control de servicio y debe tener el derecho de acceso SC_MANAGER_ENUMERATE_SERVICE. Para obtener más información, consulte derechos de acceso y seguridad del servicio.

Solo puede haber una solicitud de notificación pendiente por servicio.

[in] dwNotifyMask

Tipo de cambios de estado que se deben notificar. Este parámetro puede ser uno o varios de los siguientes valores.

Valor Significado
SERVICE_NOTIFY_CREATED
0x00000080
Informe cuando se haya creado el servicio.

El parámetro hService debe ser un identificador para el SCM.

SERVICE_NOTIFY_CONTINUE_PENDING
0x00000010
Informe cuando el servicio esté a punto de continuar.

El parámetro hService debe ser un identificador para el servicio.

SERVICE_NOTIFY_DELETE_PENDING
0x00000200
Informe cuando una aplicación haya especificado el servicio en una llamada a la función DeleteService. La aplicación debe cerrar los identificadores del servicio para que se pueda eliminar.

El parámetro hService debe ser un identificador para el servicio.

SERVICE_NOTIFY_DELETED
0x00000100
Informe cuando se haya eliminado el servicio. Una aplicación no puede recibir esta notificación si tiene un identificador abierto para el servicio.

El parámetro hService debe ser un identificador para el SCM.

SERVICE_NOTIFY_PAUSE_PENDING
0x00000020
Informe cuando el servicio se está pausando.

El parámetro hService debe ser un identificador para el servicio.

SERVICE_NOTIFY_PAUSED
0x00000040
Informe cuando el servicio se haya pausado.

El parámetro hService debe ser un identificador para el servicio.

SERVICE_NOTIFY_RUNNING
0x00000008
Informe cuando el servicio se está ejecutando.

El parámetro hService debe ser un identificador para el servicio.

SERVICE_NOTIFY_START_PENDING
0x00000002
Informe cuando se inicie el servicio.

El parámetro hService debe ser un identificador para el servicio.

SERVICE_NOTIFY_STOP_PENDING
0x00000004
Informe cuando el servicio se detenga.

El parámetro hService debe ser un identificador para el servicio.

SERVICE_NOTIFY_STOPPED
0x00000001
Informe cuando el servicio se haya detenido.

El parámetro hService debe ser un identificador para el servicio.

[in] pNotifyBuffer

Puntero a una estructura de SERVICE_NOTIFY que contiene información de notificación, como un puntero a la función de devolución de llamada. Esta estructura debe permanecer válida hasta que se invoque la función de devolución de llamada o el subproceso que realiza la llamada cancele la solicitud de notificación.

No realice varias llamadas a NotifyServiceStatusChange con el mismo parámetro de búfer hasta que se haya cancelado la función de devolución de llamada de la primera llamada con el búfer o la primera solicitud de notificación. De lo contrario, no hay ninguna garantía de qué versión del búfer recibirá la función de devolución de llamada.

Windows Vista: La dirección de la función de devolución de llamada debe estar dentro del intervalo de direcciones de un módulo cargado. Por lo tanto, la función de devolución de llamada no puede ser código generado en tiempo de ejecución (por ejemplo, código administrado generado por el compilador JIT) o código nativo que se descomprime en tiempo de ejecución. Esta restricción se quitó en Windows Server 2008 y Windows Vista con SP1.

Valor devuelto

Si la función se ejecuta correctamente, se ERROR_SUCCESS el valor devuelto. Si el servicio se ha marcado para su eliminación, el valor devuelto es ERROR_SERVICE_MARKED_FOR_DELETE y el identificador del servicio debe cerrarse. Si la notificación de servicio se retrasa demasiado lejos del estado del sistema, la función devuelve ERROR_SERVICE_NOTIFY_CLIENT_LAGGING. En este caso, el cliente debe cerrar el identificador al SCM, abrir un nuevo identificador y llamar a esta función de nuevo.

Si se produce un error en la función, el valor devuelto es uno de los códigos de error del sistema .

Observaciones

La función NotifyServiceStatusChange se puede usar para recibir notificaciones sobre las aplicaciones de servicio. No se puede usar para recibir notificaciones sobre los servicios de controladores.

Cuando cambia el estado del servicio, el sistema invoca la función de devolución de llamada especificada como una llamada de procedimiento asincrónica (APC) en cola al subproceso que realiza la llamada. El subproceso que realiza la llamada debe especificar una espera que se pueda alertar (por ejemplo, llamando a la función SleepEx ) para recibir una notificación. Para obtener más información, vea llamadas a procedimientos asincrónicos.

Si el servicio ya está en cualquiera de los estados solicitados cuando se llama a NotifyServiceStatusChange, la función de devolución de llamada se pone en cola inmediatamente. Si el estado del servicio no ha cambiado la próxima vez que se llame a la función con el mismo servicio y estado, la función de devolución de llamada no se pone en cola inmediatamente; La función de devolución de llamada se pone en cola la próxima vez que el servicio entre en el estado solicitado.

La función NotifyServiceStatusChange llama a la función openThread en el subproceso que realiza la llamada con el derecho de acceso THREAD_SET_CONTEXT. Si el subproceso que realiza la llamada no tiene este derecho de acceso, NotifyServiceStatusChange produce un error. Si el subproceso de llamada suplanta a otro usuario, es posible que no tenga permiso suficiente para establecer el contexto.

Es más eficaz llamar a NotifyServiceStatusChange desde un subproceso que realiza una espera que crear un subproceso adicional.

Una vez invocada la función de devolución de llamada, el autor de la llamada debe llamar a NotifyServiceStatusChange para recibir notificaciones adicionales. Tenga en cuenta que ciertas funciones de la API de Windows, incluidas las NotifyServiceStatusChange y otras funciones de SCM, usan llamadas a procedimientos remotos (RPC); estas funciones pueden realizar una operación de espera alertable, por lo que no son seguras para llamar desde dentro de la función de devolución de llamada. En su lugar, la función de devolución de llamada debe guardar los parámetros de notificación y realizar cualquier trabajo adicional fuera de la devolución de llamada.

Para cancelar las notificaciones pendientes, cierre el identificador de servicio mediante la función CloseServiceHandle. Después de closeServiceHandle se realiza correctamente, no se pondrá en cola más API de notificación. Si el subproceso de llamada se cierra sin cerrar el identificador del servicio o esperando hasta que se genere el APC, se puede producir una pérdida de memoria.

Importante Si el subproceso de llamada está en un archivo DLL y el archivo DLL se descarga antes de que el subproceso reciba la notificación o llame a CloseServiceHandle, la notificación provocará resultados impredecibles y podría provocar que el proceso deje de responder.
 

Nota

El encabezado winsvc.h define NotifyServiceStatusChange 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 Vista [solo aplicaciones de escritorio]
servidor mínimo admitido Windows Server 2008 [solo aplicaciones de escritorio]
de la plataforma de destino de Windows
encabezado de winsvc.h (incluya Windows.h)
biblioteca de Advapi32.lib
DLL de Advapi32.dll

Consulte también

SERVICE_NOTIFY

SubscribeServiceChangeNotifications

Funciones de servicio