Compartilhar via


Função NotifyServiceStatusChangeA (winsvc.h)

Permite que um aplicativo receba notificação quando o serviço especificado é criado ou excluído ou quando seu status é alterado.

Sintaxe

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

Parâmetros

[in] hService

Um identificador para o serviço ou o gerenciador de controle de serviço. Os identificadores para serviços são retornados pela função do OpenService ou CreateService e devem ter o acesso SERVICE_QUERY_STATUS correto. Os identificadores para o gerenciador de controle de serviço são retornados pela função OpenSCManager e devem ter o acesso SC_MANAGER_ENUMERATE_SERVICE correto. Para obter mais informações, consulte de Direitos de Acesso e Segurança do Serviço.

Só pode haver uma solicitação de notificação pendente por serviço.

[in] dwNotifyMask

O tipo de alterações de status que devem ser relatadas. Esse parâmetro pode ser um ou mais dos valores a seguir.

Valor Significado
SERVICE_NOTIFY_CREATED
0x00000080
Relatar quando o serviço tiver sido criado.

O parâmetro hService deve ser um identificador para o SCM.

SERVICE_NOTIFY_CONTINUE_PENDING
0x00000010
Informe quando o serviço está prestes a continuar.

O parâmetro hService deve ser um identificador para o serviço.

SERVICE_NOTIFY_DELETE_PENDING
0x00000200
Relatar quando um aplicativo tiver especificado o serviço em uma chamada para a função DeleteService. Seu aplicativo deve fechar todos os identificadores do serviço para que ele possa ser excluído.

O parâmetro hService deve ser um identificador para o serviço.

SERVICE_NOTIFY_DELETED
0x00000100
Relatar quando o serviço tiver sido excluído. Um aplicativo não poderá receber essa notificação se tiver um identificador aberto para o serviço.

O parâmetro hService deve ser um identificador para o SCM.

SERVICE_NOTIFY_PAUSE_PENDING
0x00000020
Relatar quando o serviço está em pausa.

O parâmetro hService deve ser um identificador para o serviço.

SERVICE_NOTIFY_PAUSED
0x00000040
Relatar quando o serviço tiver pausado.

O parâmetro hService deve ser um identificador para o serviço.

SERVICE_NOTIFY_RUNNING
0x00000008
Relatar quando o serviço está em execução.

O parâmetro hService deve ser um identificador para o serviço.

SERVICE_NOTIFY_START_PENDING
0x00000002
Relatar quando o serviço está sendo iniciado.

O parâmetro hService deve ser um identificador para o serviço.

SERVICE_NOTIFY_STOP_PENDING
0x00000004
Relatar quando o serviço está parando.

O parâmetro hService deve ser um identificador para o serviço.

SERVICE_NOTIFY_STOPPED
0x00000001
Relatar quando o serviço for interrompido.

O parâmetro hService deve ser um identificador para o serviço.

[in] pNotifyBuffer

Um ponteiro para uma estrutura SERVICE_NOTIFY que contém informações de notificação, como um ponteiro para a função de retorno de chamada. Essa estrutura deve permanecer válida até que a função de retorno de chamada seja invocada ou o thread de chamada cancele a solicitação de notificação.

Não faça várias chamadas para NotifyServiceStatusChange com o mesmo parâmetro de buffer até que a função de retorno de chamada da primeira chamada seja concluída com o buffer ou a primeira solicitação de notificação seja cancelada. Caso contrário, não há garantia de qual versão do buffer a função de retorno de chamada receberá.

Windows Vista: O endereço da função de retorno de chamada deve estar dentro do intervalo de endereços de um módulo carregado. Portanto, a função de retorno de chamada não pode ser um código gerado em tempo de execução (como código gerenciado gerado pelo compilador JIT) ou código nativo descompactado em tempo de execução. Essa restrição foi removida no Windows Server 2008 e no Windows Vista com SP1.

Valor de retorno

Se a função for bem-sucedida, o valor retornado será ERROR_SUCCESS. Se o serviço tiver sido marcado para exclusão, o valor retornado será ERROR_SERVICE_MARKED_FOR_DELETE e o identificador para o serviço deverá ser fechado. Se a notificação de serviço estiver muito atrasada em relação ao estado do sistema, a função retornará ERROR_SERVICE_NOTIFY_CLIENT_LAGGING. Nesse caso, o cliente deve fechar o identificador do SCM, abrir um novo identificador e chamar essa função novamente.

Se a função falhar, o valor retornado será um dos códigos de erro do sistema .

Observações

A função NotifyServiceStatusChange pode ser usada para receber notificações sobre aplicativos de serviço. Ele não pode ser usado para receber notificações sobre serviços de driver.

Quando o status do serviço é alterado, o sistema invoca a função de retorno de chamada especificada como uma APC (chamada de procedimento assíncrono) enfileirada no thread de chamada. O thread de chamada deve inserir uma espera alertável (por exemplo, chamando a função SleepEx) para receber a notificação. Para obter mais informações, consulte chamadas de procedimento assíncrono.

Se o serviço já estiver em qualquer um dos estados solicitados quando NotifyServiceStatusChange for chamado, a função de retorno de chamada será enfileirada imediatamente. Se o estado do serviço não tiver sido alterado na próxima vez que a função for chamada com o mesmo serviço e estado, a função de retorno de chamada não será enfileirada imediatamente; a função de retorno de chamada é enfileirada na próxima vez que o serviço entrar no estado solicitado.

A função NotifyServiceStatusChange chama a função OpenThread no thread de chamada com o acesso THREAD_SET_CONTEXT à direita. Se o thread de chamada não tiver esse acesso correto, NotifyServiceStatusChange falhar. Se o thread de chamada estiver representando outro usuário, ele poderá não ter permissão suficiente para definir o contexto.

É mais eficiente chamar NotifyServiceStatusChange de um thread que executa uma espera do que criar um thread adicional.

Depois que a função de retorno de chamada for invocada, o chamador deverá chamar NotifyServiceStatusChange para receber notificações adicionais. Observe que determinadas funções na API do Windows, incluindo NotifyServiceStatusChange e outras funções SCM, usam chamadas de procedimento remoto (RPC); essas funções podem executar uma operação de espera alertável, portanto, elas não são seguras para chamar de dentro da função de retorno de chamada. Em vez disso, a função de retorno de chamada deve salvar os parâmetros de notificação e executar qualquer trabalho adicional fora do retorno de chamada.

Para cancelar notificações pendentes, feche o identificador de serviço usando a função CloseServiceHandle. Depois que CloseServiceHandle for bem-sucedido, não haverá mais APCs de notificação na fila. Se o thread de chamada for encerrado sem fechar o identificador de serviço ou aguardar até que o APC seja gerado, poderá ocorrer um vazamento de memória.

Importante Se o thread de chamada estiver em uma DLL e a DLL for descarregada antes que o thread receba a notificação ou as chamadas CloseServiceHandle, a notificação causará resultados imprevisíveis e poderá fazer com que o processo pare de responder.
 

Nota

O cabeçalho winsvc.h define NotifyServiceStatusChange como um alias que seleciona automaticamente a versão ANSI ou Unicode dessa função com base na definição da constante do pré-processador UNICODE. A combinação do uso do alias neutro de codificação com código que não é neutro em codificação pode levar a incompatibilidades que resultam em erros de compilação ou de runtime. Para obter mais informações, consulte Conventions for Function Prototypes.

Requisitos

Requisito Valor
de cliente com suporte mínimo Windows Vista [somente aplicativos da área de trabalho]
servidor com suporte mínimo Windows Server 2008 [somente aplicativos da área de trabalho]
da Plataforma de Destino Windows
cabeçalho winsvc.h (incluir Windows.h)
biblioteca Advapi32.lib
de DLL Advapi32.dll

Consulte também

SERVICE_NOTIFY

SubscribeServiceChangeNotifications

Funções de serviço