Freigeben über


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:

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.