Schutz vor Wiederinvarianz in Hookfunktionen

Während eine Hookfunktion ein Ereignis verarbeitet, können zusätzliche Ereignisse ausgelöst werden. Dies kann dazu führen, dass die Hookfunktion erneut eingibt, bevor die Verarbeitung des ursprünglichen Ereignisses abgeschlossen ist. Das Problem der Wiederinvarianz in Hookfunktionen besteht darin, dass Ereignisse außerhalb der Sequenz abgeschlossen werden, es sei denn, die Hookfunktion behandelt diese Situation.

Stellen Sie sich beispielsweise einen Fall vor, in dem eine Hookfunktion in einem Sprachausgabeprogramm das EVENT _ OBJECT _ VALUECHANGE-Ereignis für ein Bearbeitungssteuerelement verarbeitet. Wenn während der Verarbeitung des ersten Wertänderungsereignisses die Hookfunktion erneut zum Verarbeiten eines nachfolgenden Wertänderungsereignisses eingeschaltet 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 zusätzliche Ereignisse jedes Mal empfangen werden, wenn die Hookfunktion eine Funktion aufruft, die bewirkt, dass die Nachrichtenwarteschlange des besitzenden Threads überprüft wird. Dies geschieht, wenn eine der folgenden Funktionen innerhalb der Hookfunktion aufgerufen wird:

Da Hookfunktionen AccessibleObjectFromEvent- und IAccessible-Eigenschaften und -Methoden aufrufen, ist es nicht möglich, Eineinvarianz zu verhindern. Die einzige Lösung besteht darin, dass Cliententwickler Code in der Hookfunktion hinzufügen, der Wiederinvarianz erkennt und entsprechende Maßnahmen ergreifen kann, wenn die Hookfunktion erneut ausgelöst wird.