Partager via


Protection contre la réentrance dans les fonctions hook

Pendant qu’une fonction de hook traite un événement, d’autres événements peuvent être déclenchés, ce qui peut entraîner la réentrée de la fonction de hook avant la fin du traitement de l’événement d’origine. Le problème avec la réentrance dans les fonctions de hook est que les événements sont terminés hors séquence, sauf si la fonction de crochet gère cette situation.

Par exemple, considérez un cas où une fonction de crochet dans un programme de lecteur d’écran traite l’événement EVENT_OBJECT_VALUECHANGE pour un contrôle d’édition. Si, lors du traitement du premier événement de changement de valeur, la fonction hook est réinscrite pour traiter un événement de changement de valeur suivant, le deuxième événement est terminé avant le premier événement. Cette situation amène le lecteur d’écran à transmettre des informations inexactes à l’utilisateur.

Étant donné que le traitement des événements est interrompu, des événements supplémentaires peuvent être reçus chaque fois que la fonction de hook appelle une fonction qui provoque la vérification de la file d’attente des messages du thread propriétaire. Cela se produit lorsque l’un des éléments suivants est appelé dans la fonction hook :

Étant donné que les fonctions de hook appellent les propriétés et méthodes AccessibleObjectFromEvent et IAccessible , il n’est pas possible d’empêcher la réentrance. La seule solution consiste pour les développeurs clients à ajouter du code dans la fonction de hook qui détecte la réentrance et prend les mesures appropriées si la fonction de hook est réinscrite.