AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Mittels CodeRedirect Funktionen patchen

Ein Thema von ConnorMcLeod · begonnen am 1. Mär 2012 · letzter Beitrag vom 2. Mär 2012
Antwort Antwort
Benutzerbild von ConnorMcLeod
ConnorMcLeod

Registriert seit: 13. Okt 2010
Ort: Bayern
490 Beiträge
 
Delphi 10.4 Sydney
 
#1

Mittels CodeRedirect Funktionen patchen

  Alt 1. Mär 2012, 19:21
Delphi-Version: 5
Hallo DPler,
wie es der Zufall will, habe ich ein ähnliches Problem wie Himitsu:

Ich möchte in der Unit <Graphics.pas> die Routine <RequiredState> vom TCanvas ersetzen. Das geht so (und funkt auch - getestet):

Neue Unit, z.B. UMyCanvas.pas, dort:

eine neue Klasse für den Hack, der Zugriff auf das private Feld <State> ermöglicht:

Delphi-Quellcode:
  THackCanvas = class(Graphics.TCanvas)
  private
    FHandle: HDC;
    State : TCanvasState;
  end;
Eine neue Klasse, in der die neue Routine definiert wird:
Delphi-Quellcode:
  TMyCanvas = class(Graphics.TCanvas)
  protected
    procedure RequiredStatePatch(ReqState: TCanvasState);
  end;
...
implementation
...
procedure TMyCanvas.RequiredStatePatch(ReqState: TCanvasState);
var
  NeededState: TCanvasState;
begin
  NeededState := ReqState - THackCanvas(Self).State;
end;
Im initialization-Teil wird dann mittels CodeRedirect (von http://chee-yang.blogspot.com/2008/11/hack-into-delphi-class.html) die Adresse der vorhandenen Routine durch die Adresse der neuen Routine ersetzt und die neue Routine wird künftig so verwendet, als ob sie ganz normal zu TCanvas gehören würde:

Delphi-Quellcode:
var
  P: TCodeRedirect;

initialization
  P := TCodeRedirect.Create(@TMyCanvas.RequiredState, @TMyCanvas.RequiredStatePatch);

finalization
  P.Free;
OK.

Das Problem ist: für den Zugriff auf <State> muss ich in RequiredStatePatch schreiben: THackCanvas(Self).State , damit das Ganze kompiliert; zur Laufzeit aber gilt das nicht mehr, weil sich die Routine - nach dem Umbiegen der Adresse - zu TCanvas zugehörig fühlt und deshalb hier nur State stehen dürfte. Irgendwie ein Henne/Ei-Problem.

Wenn zur Laufzeit THackCanvas(Self).State abgefragt wird, dann bringt das ein falsches Ergebnis.

War das halbwegs verständlich bzw wer weiss Rat?
Nr.1 Delphi-Tool: [F7]

Geändert von ConnorMcLeod ( 1. Mär 2012 um 19:23 Uhr) Grund: Tags ergänzt
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#2

AW: Mittels CodeRedirect Funktionen patchen

  Alt 1. Mär 2012, 21:59
Wenn Du schon so einen 'Blödsinn' machst, dann mach es richtig: Editiere Graphics.PAS und verändere sie nach deinen Vorstellungen. Dein Vorgehen ist eh nicht kompatibel und sauber.

Mit 'Blödsinn' meine ich nur die Art und Weise, wie Du das Problem lösen willst ('Mit dem Kopf durch die Wand'). Oder reizt dich nur die technische Machbarkeit?
  Mit Zitat antworten Zitat
Thom

Registriert seit: 19. Mai 2006
570 Beiträge
 
Delphi XE3 Professional
 
#3

AW: Mittels CodeRedirect Funktionen patchen

  Alt 1. Mär 2012, 22:08
Das ist kein Blödsinn. Vor einem Jahr hatte ich leider auch noch so argumentiert. Inzwischen weiß ich aber, daß einige Probleme, die durch "Compilermagie" erst verursacht werden oder durch - nett ausgedrückt - ungünstige Programmierung der System-Units entstehen, nur durch das Patchen der entsprechenden Stellen im Speicher zur Laufzeit behoben werden können. Dagegen ist die Neucompilierung der Delphi-Units unsinnig und durch das Fehlen einiger Bestandteile oft auch nicht machbar.
Thomas Nitzschke
Google Maps mit Delphi
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Mittels CodeRedirect Funktionen patchen

  Alt 2. Mär 2012, 01:04
Wenn es dir nur um State geht, könntest du's auch so machen. (Merkwürdig, daß die private Variable in der Graphics nicht FState heißt ):

Delphi-Quellcode:
unit Unit2;

interface

type
  TTest = class
  private
    State: integer;
  public
    property Test: integer read State;
    constructor Create;
  end;

implementation

constructor TTest.Create;
begin
  State:= -1;
end;

end.
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, unit2;

type
  TMyTest = class
  private
    State: integer;
  end;

  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    O: TTest;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(IntToStr(O.Test));
  TMyTest(O).State:= 1;
  ShowMessage(IntToStr(O.Test));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  O:= TTest.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  O.Free;
end;

end.
  Mit Zitat antworten Zitat
Benutzerbild von ConnorMcLeod
ConnorMcLeod

Registriert seit: 13. Okt 2010
Ort: Bayern
490 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Mittels CodeRedirect Funktionen patchen

  Alt 2. Mär 2012, 05:36
@Furtbichler: wie Thom schon sagt, möchte ich die Originale nicht editieren. Das hätte enorme Auswirkungen auf die ganze Firma; so passe ich nur das Verhalten einiger Komponenten an. Es ist übrigens eine ähnliche Methode, wie sie auch in Delphi Speed Up und in IDE Fix Pack angewandt werden, die die meisten von uns täglich im Einsatz haben.

@Thom: ganz meine Meinung.

@Bjoerk: Du siehst das Problem nur von außen - da funktioniert es so, wie Du sagst. Aber durch das Patchen wird die Prozedur zu einem integrierten Teil der gepachten Klasse und daher ist dann das Casten unnötig geworden.
Nr.1 Delphi-Tool: [F7]
  Mit Zitat antworten Zitat
Antwort Antwort


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 18:23 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