Einzelnen Beitrag anzeigen

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, 08: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