Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Methodenaufruf umbiegen? (https://www.delphipraxis.net/143952-methodenaufruf-umbiegen.html)

Neutral General 26. Nov 2009 18:43

Re: Methodenaufruf umbiegen?
 
Es soll aber mit JEDER Klasse funktionieren. Wie soll ich von ner Klasse ableiten, die jemand der meine Unit benutzen wird gerade erst baut?

brechi 26. Nov 2009 18:47

Re: Methodenaufruf umbiegen?
 
Du brauchs nen codeoverwriting hook, z.b. den von madshi. Der kann ruhig mehr überschreiben und kann im Anschluss trotzdem noch die Funktion ausführen (da die bytes gesichert werden).
Wenn du es dennoch selbst machen willst gibts mehrere möglichkeiten:

1) dubiegst den relativen jump um der dahinspringt
2) du überschreibst (und in deiner hookroutine schreibst die alten bytes zurück -> langsam und net threadsafe)
3) du verwendest Hardwarebreakpoints bzw. einen int 3 hook (also setzt einen int 3 = breakpoint + hooks den exceptionhandler und fängst deine ab) -> ebenfalls net sonderlich schnell

mjustin 26. Nov 2009 18:48

Re: Methodenaufruf umbiegen?
 
Class Helper in Delphi können eine Funktion überdecken (oder hinzufügen), ohne die bestehende Klasse ändern zu müssen:

http://www.delphi-treff.de/sprachen/...helferklassen/

Sie sind damit quasi das GOTO der objektorientierten Programmierung :)

Cheers,

Medium 26. Nov 2009 18:50

Re: Methodenaufruf umbiegen?
 
AHA! Das muss ja nu auch gesagt werden ;) Gekapseltes Verhalten fremder Klassen zu manipulieren fällt definitiv eh schon unter "dirty hack". Was tut deine Unit? Vielleicht fände sich ja generell noch ein Ansatz der mir weniger Kopfweh machen würde :stupid:

Edit: Class-Helper sind auch ein Weg, und werden auch gern zu Decorator-Zwecken genommen. Ich hatte die nur aussen vor gelassen, da ich Gedanklich noch in Delphi 7 stecke, und es sowat da noch nicht gab :angel:

himitsu 26. Nov 2009 18:50

Re: Methodenaufruf umbiegen?
 
Zitat:

Zitat von Neutral General
Es soll aber mit JEDER Klasse funktionieren. Wie soll ich von ner Klasse ableiten, die jemand der meine Unit benutzen wird gerade erst baut?

Indem du ihn zwingst/überredest, eine Schnittstelle zu nutzen/implentieren, welche das gewünschte Verhalten ermöglicht.

Neutral General 26. Nov 2009 18:51

Re: Methodenaufruf umbiegen?
 
Zitat:

Zitat von mjustin
Class Helper in Delphi können eine Funktion überdecken (oder hinzufügen), ohne die bestehende Klasse ändern zu müssen:

http://www.delphi-treff.de/sprachen/...helferklassen/

Sie sind damit quasi das GOTO der objektorientierten Programmierung :)

Cheers,

x.x

Leute.. Wenn man mein Problem mit OOP lösen könnte, dann hätte ich das schon getan :freak:

Was bringt mir ein Class Helper wenn ich Properties von fremden, mir nicht bekannten Klassen überwachen will? :?

Namenloser 26. Nov 2009 18:51

Re: Methodenaufruf umbiegen?
 
Hat nicht jede jedes Objekt im Speicher eine interene Tabelle, in der Pointer auf die jeweiligen Methoden enthalten sind? Zumindest bei virtuellen bzw. überschriebenen Methoden ist das doch nötig. Eventuell könntest du es darüber irgendwie probieren...

Ansonsten: Könnte man das nicht mit einem Class Helper umsetzen? Ich habe leider keine Erfahrung mit diesen, weil ich keine Delphi-Version besitze, die Class Helper unterstützt, aber so wie ich es verstehe, sind sie ja sozusagen "Patches" für Klassen. Damit wären sie doch eigentlich das, was du brauchst.

Edit: @Beitrag über mir: Natürlich bringen Class Helpers nur etwas, wenn sie die Möglichkeit bieten, Methoden zu überschreiben. Davon bin ich ausgegangen. Ist das nicht der Fall, dann ignoriere meinen Vorschlag einfach.

himitsu 26. Nov 2009 19:04

Re: Methodenaufruf umbiegen?
 
Nein, bei sowas werden die Prozeduren direkt angesprungen.

z.B. bei der WinAPI (DLL-Exports) gibt es sowas
- der Spung zur Tabelle ist hartcodiert und dort ist dann die Tabelle, da die Adressen ja veränderlich sind.

virtuelle und dynamische Methoden stehen auch in Tabellen

Medium 26. Nov 2009 19:16

Re: Methodenaufruf umbiegen?
 
Zitat:

Zitat von Neutral General
Leute.. Wenn man mein Problem mit OOP lösen könnte, dann hätte ich das schon getan :freak:

...weswegen eine Anfrage auch eigentlich immer beinhalten sollte, was man schon so versucht hat. Ist ja nicht so, dass das nicht des öfteren schon in der DP Thema war :cheer:
Und selbst DANN gibt es fast immer noch Wege an die man selbst evtl. dann doch noch nicht gedacht hat - nobody is perfect. Und da uns partout nicht erzählen magst, was du im großen und ganzen vor hast (um evtl. einen anderen Weg zu finden - was ja schon irgendwo in deinem Interesse sein dürfte), klinke ich mich mal aus. Weil dass das so wie von dir erhofft eher nix wird dürfte nun ja klar genug geworden sein - so "tänzelnde" Beiträge der Art "hmmm, was hast'n vor, das geht evtl. anders" deuten da ja eigentlich ganz gut drauf hin.

Namenloser 26. Nov 2009 19:16

Re: Methodenaufruf umbiegen?
 
Zitat:

Zitat von himitsu
Nein, bei sowas werden die Prozeduren direkt angesprungen.

z.B. bei der WinAPI (DLL-Exports) gibt es sowas
- der Spung zur Tabelle ist hartcodiert und dort ist dann die Tabelle, da die Adressen ja veränderlich sind.

virtuelle und dynamische Methoden stehen auch in Tabellen

Also ich habe mal irgendwo gelesen, dass Delphi es beim Late-Bindig genau so macht. Eigentlich geht es doch auch nicht anders.
Delphi-Quellcode:
type
  TClassA = class(TObject)
  protected
    function GetMesage: string; virtual;
  public
    procedure DoSomething;
  end;

  TClassB = class(TClassA )
  protected
    function GetMesage: string; override;
  end;

implementation

procedure TClassA.DoSomething;
begin
  ShowMessage(GetMessage);
end;

function TClassA.GetMessage: string;
begin
  Result := 'Grüße der Basisklasse';
end;

function TClassB.GetMessage: string;
begin
  Result := 'Hier spricht ClassB';
end;

var
  Something: TClassA;
begin
  Something := TClassA.Create;
  Something.DoSomething; // TClassA.DoSomething wird aufgerufen
  Something.Free;

  Something := TClassB.Create;
  Something.DoSomething; // WIEDER wird TClassA.DoSomething aufgerufen, aber mit anderem Ergebnis
  Something.Free;
end.
Bei beiden Instanzen sollte DoSomething auf die gleiche Adresse zeigen. Trotzdem kommt jeweils ein anderes Ergebnis zurück. Damit das funktioniert, muss irgendwo eine Tabelle existieren, die die Methodenzeiger enthält. Woher sollte die Klasse sonst wissen, welche Methode aufgerufen werden muss? Wenn eine Methode nicht virtuell ist, ist das natürlich etwas anderes, dann kann der Compiler diesen Schritt wegoptimieren.

Edit: Ach verdammt, hab dein Edit übersehen :wall:


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:02 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz