Proteção contra reentrância em funções de gancho
Enquanto uma função de gancho processa um evento, eventos adicionais podem ser acionados, o que pode fazer com que a função de gancho seja reinserida antes que o processamento para o evento original seja concluído. O problema de reentrância em funções hook é que os eventos são concluídos fora de sequência, a menos que a função hook lide com essa situação.
Por exemplo, considere um caso em que uma função hook num programa de leitor de ecrã está a processar o evento EVENT_OBJECT_VALUECHANGE para um controlo de edição. Se, durante o processamento do primeiro evento de alteração de valor, a função hook for reinserida para processar um evento de alteração de valor subsequente, o segundo evento será concluído antes do primeiro evento. Esta situação resulta no leitor de tela transmitindo informações imprecisas para o usuário.
Como o processamento de eventos é interrompido, eventos adicionais podem ser recebidos sempre que a função hook chamar uma função que faz com que a fila de mensagens do thread proprietário seja verificada. Isso acontece quando qualquer um dos seguintes itens é chamado dentro da função de gancho:
- O Windows função SendMessage, a função GetMessage, a função PeekMessage, a função DialogBox, ou a função MessageBox
- As funções do Microsoft Ative Accessibility AccessibleObjectFromEvent, AccessibleObjectFromWindowAccessibleObjectFromPoint
- Um interface IAccessible ou outra propriedade ou método COM (Component Object Model) que cruza os limites do processo
Como as funções de gancho chamam AccessibleObjectFromEvent e IAccessible propriedades e métodos, não é possível impedir a reentrância. A única solução é que os desenvolvedores de clientes adicionem código na função hook que deteta reentrância e tomem as medidas apropriadas se a função hook for reinserida.