Schutz vor Reentrancy in Hakenfunktionen
Während eine Hookfunktion ein Ereignis verarbeitet, können zusätzliche Ereignisse ausgelöst werden, die dazu führen können, dass die Hookfunktion erneut eingibt, bevor die Verarbeitung für das ursprüngliche Ereignis abgeschlossen ist. Das Problem mit der Reentrancy in Hookfunktionen besteht darin, dass Ereignisse außerhalb der Sequenz abgeschlossen werden, es sei denn, die Hookfunktion verarbeitet diese Situation.
Betrachten Sie beispielsweise einen Fall, in dem eine Hookfunktion in einem Sprachausgabeprogramm das EVENT_OBJECT_VALUECHANGE-Ereignis für ein Bearbeitungssteuerelement verarbeitet. Wenn beim Verarbeiten des ersten Wertänderungsereignisses die Hookfunktion erneut zur Verarbeitung eines nachfolgenden Wertänderungsereignisses verwendet wird, wird das zweite Ereignis vor dem ersten Ereignis abgeschlossen. Diese Situation führt dazu, dass die Sprachausgabe dem Benutzer ungenaue Informationen übermittelt.
Da die Ereignisverarbeitung unterbrochen wird, können jederzeit zusätzliche Ereignisse empfangen werden, wenn die Hookfunktion eine Funktion aufruft, die dazu führt, dass die Nachrichtenwarteschlange des besitzenden Threads überprüft wird. Dies geschieht, wenn eine der folgenden Elemente innerhalb der Hookfunktion aufgerufen wird:
- Die Windows SendMessage-, GetMessage-, PeekMessage-, DialogBox- oder MessageBox-Funktion
- Die Microsoft Active Accessibility-Funktionen AccessibleObjectFromEvent, AccessibleObjectFromWindow, AccessibleObjectFromPoint
- Eine IAccessible-Schnittstelle oder eine andere COM-Eigenschaft (Component Object Model) oder -Methode, die Prozessgrenzen überschreitet
Da Hookfunktionen Eigenschaften und Methoden AccessibleObjectFromEvent und IAccessible aufrufen, ist es nicht möglich, eine Erneuteinreichung zu verhindern. Die einzige Lösung besteht darin, dass Cliententwickler Code in der Hookfunktion hinzufügen, der die Erneuteintrahierung erkennt, und geeignete Maßnahmen ergreifen, wenn die Hookfunktion erneut zurückgegeben wird.