AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte ScriptEngine II (v. 0.6.1)

ScriptEngine II (v. 0.6.1)

Ein Thema von littleDave · begonnen am 21. Sep 2009 · letzter Beitrag vom 4. Aug 2011
 
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.340 Beiträge
 
Delphi 12 Athens
 
#11

Re: ScriptEngine II (v. 0.5.0.0)

  Alt 27. Apr 2010, 18:14
Zitat von littleDave:
Für Interfaces in den Scripts habe ich mal versucht den Assembler-Code, den Delphi erstellt, versucht zu verstehen. Das Problem ist halt die richtige Zuordnung der Methoden - da habe ich noch kein Konzept für gefunden.
Delphi-Quellcode:
PInterfaceEntry = ^TInterfaceEntry;
TInterfaceEntry = packed record
  IID: TGUID;
  VTable: Pointer;
  IOffset: Integer;
  ImplGetter: Integer;
end;

PInterfaceTable = ^TInterfaceTable;
TInterfaceTable = packed record
  EntryCount: Integer;
  Entries: array[0..9999] of TInterfaceEntry;
end;

TObject:
  function GetInterface(const IID: TGUID; out Obj): Boolean;
  class function GetInterfaceEntry(const IID: TGUID): PInterfaceEntry;
  class function GetInterfaceTable: PInterfaceTable;
Da findestes du schonmal alle Interfaces eines Objektes.
Hier im Forum suchenPInterfaceTable

Direkt an der Adresse, wohin der Interfacezeiger zeigt, liegt eine MethodAdressTabelle.

Und die InterfaceMethoden werden einfach über ihren Index aufgerufen.

Delphi-Quellcode:
IInterface = interface
  function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
  function _AddRef: Integer; stdcall;
  function _Release: Integer; stdcall;
end;
Kannst dir ja mal hiervon den ASM-Code anzeigen lassen:
Delphi-Quellcode:
var Intf: IInterface;
begin
  Integer(Intf) := $123;
  Intf._AddRef;
_AddRef ist die 2. Methode des Interfaces.
Es gibt auch keine Vorfahren dieses Interfaces ... deren Methoden würden sonst vorher aufgezählt.
Somit hat die Methode die Adresse, welche bei +4 Byte (Index = 1, da 0-basierendes Array) in dieser Tabelle liegt.

Code:
mov eax, Intf
call TMethod(PPointer(Intf)^ + Index)
Delphi-Quellcode:
ITest = Interface(IInterface)
  Procedure Test;
end;
PS: Wenn nix angegeben ist, dann ist der Standardvorfahr automatisch IInterface.

.Test läge also bei Index 4 aka +12 Byte (0 bis 3 in IInterface und die 4 in ITest)
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
 

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:34 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz