Partilhar via


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:

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.