Protezione dalla reentrancy nelle funzioni hook
Mentre una funzione hook elabora un evento, possono essere attivati eventi aggiuntivi, che possono causare la reinserizione della funzione hook prima del completamento dell'elaborazione per l'evento originale. Il problema della reentrancy nelle funzioni hook è che gli eventi vengono completati fuori sequenza, a meno che la funzione hook non gestisca questa situazione.
Si consideri, ad esempio, un caso in cui una funzione hook in un programma per la lettura dello schermo stia elaborando l'evento EVENT_OBJECT_VALUECHANGE per un controllo di modifica. Se, durante l'elaborazione del primo evento di modifica del valore, la funzione hook viene nuovamente immessa per elaborare un evento di modifica del valore successivo, il secondo evento viene completato prima del primo evento. Questa situazione comporta che l'utilità per la lettura dello schermo trasmetta informazioni imprecise all'utente.
Poiché l'elaborazione degli eventi viene interrotta, è possibile che vengano ricevuti eventi aggiuntivi ogni volta che la funzione hook chiama una funzione che causa la verifica della coda di messaggi del thread proprietario. Ciò si verifica quando viene chiamato uno dei seguenti elementi all'interno della funzione hook:
- La funzione Windows SendMessage, GetMessage, PeekMessage, DialogBox, o MessageBox
- Le funzioni di Microsoft Active Accessibility AccessibleObjectFromEvent, AccessibleObjectFromWindow, AccessibleObjectFromPoint
- Un'interfaccia IAccessible o un'altra proprietà o metodo COM (Component Object Model) che attraversa i confini del processo
Poiché le funzioni hook chiamano AccessibleObjectFromEvent e le proprietà e i metodi IAccessible, non è possibile impedire la reentrancy. L'unica soluzione è che gli sviluppatori client aggiungano codice nella funzione hook che rileva il reingresso e prendano le azioni appropriate se la funzione hook viene reinserita.