AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Methodenaufruf umbiegen?

Ein Thema von Neutral General · begonnen am 26. Nov 2009 · letzter Beitrag vom 27. Nov 2009
Antwort Antwort
Seite 2 von 3     12 3   
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#11

Re: Methodenaufruf umbiegen?

  Alt 26. Nov 2009, 18:43
Es soll aber mit JEDER Klasse funktionieren. Wie soll ich von ner Klasse ableiten, die jemand der meine Unit benutzen wird gerade erst baut?
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#12

Re: Methodenaufruf umbiegen?

  Alt 26. Nov 2009, 18:47
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
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.004 Beiträge
 
Delphi 2009 Professional
 
#13

Re: Methodenaufruf umbiegen?

  Alt 26. Nov 2009, 18:48
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,
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#14

Re: Methodenaufruf umbiegen?

  Alt 26. Nov 2009, 18:50
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

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
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

Re: Methodenaufruf umbiegen?

  Alt 26. Nov 2009, 18:50
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#16

Re: Methodenaufruf umbiegen?

  Alt 26. Nov 2009, 18:51
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

Was bringt mir ein Class Helper wenn ich Properties von fremden, mir nicht bekannten Klassen überwachen will?
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#17

Re: Methodenaufruf umbiegen?

  Alt 26. Nov 2009, 18:51
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

Re: Methodenaufruf umbiegen?

  Alt 26. Nov 2009, 19:04
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#19

Re: Methodenaufruf umbiegen?

  Alt 26. Nov 2009, 19:16
Zitat von Neutral General:
Leute.. Wenn man mein Problem mit OOP lösen könnte, dann hätte ich das schon getan
...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
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.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#20

Re: Methodenaufruf umbiegen?

  Alt 26. Nov 2009, 19:16
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
  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 15:42 Uhr.
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