AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Hook auf Propertys, Konstruktoren, Destruktoren?
Thema durchsuchen
Ansicht
Themen-Optionen

Hook auf Propertys, Konstruktoren, Destruktoren?

Ein Thema von SubData · begonnen am 19. Okt 2007 · letzter Beitrag vom 22. Okt 2007
 
Benutzerbild von SubData
SubData

Registriert seit: 14. Sep 2004
Ort: Stuhr
1.078 Beiträge
 
Delphi 11 Alexandria
 
#1

Hook auf Propertys, Konstruktoren, Destruktoren?

  Alt 19. Okt 2007, 07:48
Aloa...

Ich hab da mal ein kleines Problem mit Hooks.
Ein Hook auf eine normale Prozedur oder Funktion ist kein Problem (uAllCollection, CodeHook, etc.)
Auch wenn ich die Adressen von Hand patche funktioniert der ganze Kram wie gewünscht,
was aber absolut nicht laufen will sind Hooks auf Propertys, Konstruktoren, Destruktoren.

Beispiel:

Delphi-Quellcode:
type
  TTableEx = class(TTable)
  public
    constructor Create(AOwner: TComponent);
    destructor Destroy;
    procedure Free;
    procedure SetRange(const StartValues, EndValues: array of const);
  end;

var
// geht nicht
  TableExConstProc : function (Self: TObject; AOwner: TComponent): TObject;
// geht auch nicht
// TableExConstProc : procedure (Self: TObject; AOwner: TComponent);
// nich compilierbar...
// TableExConstProc : constructor (Self: TObject; AOwner: TComponent);
  TableExDestProc : procedure (Self: TObject); register;
  TableExFreeProc : procedure (Self: TObject);
  TableExRangeProc : procedure (Self: TObject; const StartValues, EndValues: array of const);


implementation


constructor TTableEx.Create(AOwner: TComponent);
begin
  OutputDebugString('CreateEx');
  Result := TableExConstProc(Self, AOwner);
end;

procedure TTableEx.DestroyEx;
begin
  OutputDebugString('DestroyEx');
  TableExDestProc(Self);
end;

procedure TTableEx.Free;
begin
  OutputDebugString('FreeEx');
  TableExFreeProc(Self);
end;

procedure TTableEx.SetRange(const StartValues, EndValues: array of const);
begin
  OutputDebugString('SetRangeEx');
  TableExRangeProc(Self, StartValues, EndValues);
end;


procedure Hook;
begin
  HookCode(@TTable.SetRange, @TTableEx.SetRange, @TableExRangeProc);
  HookCode(@TTable.Create, @TTableEx.Create, @TableExConstProc);
  HookCode(@TTable.Destroy, @TTableEx.Destroy, @TableExDestProc);
  HookCode(@TTable.Free, @TTableEx.Free, @TableExFreeProc);
end;
Ein Hook auf SetRange funktioniert ohne Probleme.
Ein Hook auf Free funktioniert ebenfalls, hookt nur leider nicht TTable.Free, da nicht vorhanden, sondern TObject.Free, was nicht ganz in meinem Sinne ist.

Ein Hook auf den Konstruktor funktioniert nicht.
Oder liegt das einfach nur an einer falschen Definition der Prozedur-Variablen?

Habs natürlich auch mit den entsprechenden Directiven versucht (register, etc).
Leider ebenfalls ohne Erfolg.

Ist der interne Aufbau eines Konstruktors denn so abstrakt, dass ein Hook nicht funktionieren kann?

Mit Propertys hab ich ebenfalls das Problem, dass in dem Fall ja Setter und Getter unterschiedlich sind.


Danke schonmal an alle, die sich darüber den Kopf zerbrechen ;>


Edit:
Mir geht es natürlich darum, dass der eigentlich Aufruf ja hinterher wieder umgeleitet wird auf die originale Prozedur.
Der reine Hook in eine andere Richtung funktioniert natürlich ebenfalls mit den Konstruktoren / Destruktoren.
Ronny
/(bb|[^b]{2})/
  Mit Zitat antworten Zitat
 


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 04:48 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