2009-07-07 6 views
1

Ich las einige Artikel im Netz in Bezug auf Vtable Thunks und ich las irgendwo, Thunks können verwendet werden, um Prozeduren Anrufe zu haken/ketten.Verwenden von V-Tabelle Thunks, um Prozeduraufrufe zu ketten

Ist es erreichbar?

Weiß jemand, wie das funktioniert, auch ich bin nicht in der Lage, gute Ressource zu finden, die Thunks erklären. Irgendwelche Vorschläge dafür?

+0

Könnten Sie bitte Ihre Frage klären? Im Moment, zusammen mit deinen Kommentaren, sieht es aus wie "erzähl mir alles über alles was Thunks betrifft", was ein bisschen ... breit ist. – peterchen

Antwort

3

Die Implementierung eines rohen Thunk im Stil von V-Table Thunks ist ein letzter Ausweg. Was immer Sie erreichen müssen, kann höchstwahrscheinlich mit einer Wrapper-Funktion erreicht werden, und es wird viel weniger schmerzhaft sein.

Im Allgemeinen ist ein Thunk führt Folgendes aus:

  1. die Eingangsparameter Fix up (zB umwandeln in ein anderes Format)
  2. Rufen Sie die reale Umsetzung
  3. Abgleich Schritt 1/fix die Ausgangsparameter

ein Beispiel zu sehen, wie es funktioniert, lassen sie sich zu unserem guten Freund Raymond Chen und seine Diskussion Teller Thunks drehen:

http://blogs.msdn.com/oldnewthing/archive/2004/02/06/68695.aspx

Die Thunk er war wie folgt verwendet:

[thunk]:CSample::QueryInterface`adjustor{4}': 
    sub  DWORD PTR [esp+4], 4 ; this -= sizeof(lpVtbl) 
    jmp  CSample::QueryInterface 

Als er beschreibt, Sie haben eine Klasse, die die gleichen Methoden über mehrere Schnittstellen implementiert, so hat es mehrere V-Tabellen. (Wenn Sie COM nicht kennen, müssen Sie nur wissen, dass es direkt mit v-tables funktioniert. Daher muss ein Zeiger auf eine bestimmte Schnittstelle Funktionszeiger auf alle Methoden dieser Schnittstelle in der Reihenfolge enthalten.)

Wenn Sie zwei Schnittstellen mit unterschiedlichen Methoden in einem bestimmten Steckplatz implementieren, benötigen Sie mehrere v-Tabellen. Aber Sie schreiben die überlappenden Methoden nur einmal, so dass die Methode mit beiden "diesen" Zeigern arbeiten kann.Dazu generiert der Compiler eine Methode, die die erforderliche Korrektur durchführt und die ursprüngliche Implementierung aufruft.

Also, das Thunk führt die folgenden Schritte aus:

  1. die Eingangsparameter Fix, nämlich den verborgenen „diesen“ Zeiger, in der ersten Zeile.
  2. Rufen Sie die reale Implementierung in der zweiten Zeile auf.
  3. Cleanup: kein erforderlich (siehe unten)

Dies ist, wo die jmp Anweisung kommt in der Regel, wenn Sie die Funktion call nennen sind, es zu Ihnen zurückkommen würde, und man müßte. ret zurück zu Ihrem Anrufer. Da keine Bereinigung zu tun ist, führt der Compiler eine Optimierung durch, bei der die Ausführung direkt auf die reale Implementierung verschoben wird. Lassen Sie die Rückgabeanweisung der realen Implementierung an Ihren Aufrufer zurücksenden. Dies ist nur eine Optimierung, kein grundlegender Teil des Thunkings. Zum Beispiel werden 16/32-Bit-Thunks die Eingabe-/Ausgabeparameter je nach Bedarf zwischen 16 und 32 Bit konvertieren, so dass der Bereinigungsschritt nicht übersprungen werden kann; es muss call, nicht jmp.

Die Moral der Geschichte ist: Wenn Sie etwas brauchen, wie die jmp Optimierung zu tun, dass Sie nicht direkt in C schreiben kann ++ oder Ihre anderen High-Level-Sprache der Wahl, gehen Sie vor und schreiben thunk eine Assemblersprache . Ansonsten schreib einfach einen Wrapper und sei damit fertig.

Ehrlich gesagt, es klingt wie Sie nach der Leistungsoptimierung fragen, und die meiste Zeit (1) der Compiler ist besser zu optimieren als wir denken und (2) es wird nicht geben Sie als eine große Verbesserung wie Sie denken.

0

Nun, Sie haben gelesen, Thunks sind eine Lösung, und jetzt suchen Sie nach einem Problem zu lösen?

Thunks sind in der Regel kurze "Forwarding" -Funktionen, die kleinere - meist hartkodierte - Anpassungen ermöglichen.

VTable Chunks sind im Moment in wikipedia sehr gut erklärt. Sie verwenden das allgemeine Muster: Generieren Sie eine kleine Funktion, um Berechnungen/zusätzliche Arbeiten zur Laufzeit zu vermeiden.

Andere Orte Ich habe gesehen/genutzt Thunks:

ein Fenstergriff mit einem Fenster-Objekt zuordnen: für jedes Fenster subclassed werden, ein kleiner thunk wird fliegend erzeugt, die die Fensterprozedur mit dem Objekt aufruft Referenz wird der Thunk dann als Fensterprozedur verwendet.

Verzögerung beim Laden von DLLs: Der Thunk stellt sicher, dass die DLL beim ersten Aufruf einer Funktion geladen wird.

Überfüllen von COM-Schnittstellenaufrufen: Die Thunks stellen einen Injektionspunkt für die Diagnose bereit und springen zur eigentlichen Methode.

+0

Könntest du mir bitte die Ressourcen/Links zeigen, die ein paar Beispiele zeigen können, die all diese Dinge tun, wenn es welche gibt? – anand

+0

Für Fensterprozeduren siehe den Abschnitt über ATL unter http://web.archive.org/web/20051125022758/www.rpi.edu/~pudeyo/articles/wndproc/ (ATL verwendet Thunks, um dies zu erreichen.) – Tadmas