Proteção contra a reentrância em funções de gancho
Enquanto uma função de gancho processa um evento, eventos adicionais podem ser disparados, o que pode fazer com que a função hook seja reentrada antes que o processamento do evento original seja concluído. O problema com a reentrância em funções de gancho é que os eventos são concluídos fora da sequência, a menos que a função hook lide com essa situação.
Por exemplo, considere um caso em que uma função de gancho em um programa de leitor de tela está processando o evento EVENT_OBJECT_VALUECHANGE para um controle de edição. Se, ao processar o primeiro evento de alteração de valor, a função hook for reentrada para processar um evento de alteração de valor subsequente, o segundo evento será concluído antes do primeiro evento. Essa situação faz com que o leitor de tela transmita informações imprecisas para o usuário.
Como o processamento de eventos é interrompido, eventos adicionais podem ser recebidos sempre que a função hook chama uma função que faz com que a fila de mensagens do thread proprietário seja verificada. Isso acontece quando qualquer um dos seguintes são chamados dentro da função de gancho:
- A função SendMessage, GetMessage, PeekMessage, DialogBox ou MessageBox do Windows
- As funções de Acessibilidade Ativa da Microsoft AccessibleObjectFromEvent, AccessibleObjectFromWindow, AccessibleObjectFromPoint
- Uma interface IAccessible ou outra propriedade ou método COM (Component Object Model) que ultrapassa os limites do processo
Como as funções de gancho chamam as propriedades e métodos AccessibleObjectFromEvent e IAccessible , não é possível impedir a reentrada. A única solução é que os desenvolvedores cliente adicionem código na função de gancho que detecta a reentrância e tomem as medidas apropriadas se a função hook for reentrada.