So patchen Sie eine Methode in Classes.pas

7

Ich muss eine Methode in Classes.pas

patchen

(TReader.ReadString - Ich möchte es zwingen, eine bestimmte Codepage zu verwenden, nicht die Systemvorgabe).

Wenn ich Classes.pas in mein Projekt kopiere, muss ich am Ende die gesamte VCL neu erstellen. Gibt es eine (einfache) Möglichkeit, eine Methode zur Laufzeit zu patchen?

    
Alistair Ward 26.09.2009, 22:16
quelle

2 Antworten

7

Ich habe VCLFixPatch gefunden:

Ссылка

Ich habe die Techniken verwendet, um die Methode zu ersetzen, die ich zur Laufzeit patchen wollte.

    
Alistair Ward 27.09.2009, 04:35
quelle
19

Wenn Sie die Implementierungsseite von Classes.pas ändern, müssen Sie nicht alles neu kompilieren. Delphi findet heraus, ob eine Einheit mit einem Algorithmus neu kompiliert werden muss, der ungefähr so ​​aussieht:

  • Wenn DCU Folgendes gefunden hat:
    • Ist das DCU-Format veraltet (alte Version des Compilers)? Wenn dies der Fall ist, müssen Sie die Quelle neu kompilieren oder einen Fehler bei der Kompilierung beheben.
    • Ist die Quelle auf dem Pfad? Wenn dies der Fall ist, kompilieren Sie
    • erneut, wenn es neuer ist als die DCU
    • Für jede verwendete Einheit:
      • Analyse beim Laden wiederholen
      • Für jedes verwendete Symbol ("Import": Typ, Variable, Routine, initialisierte Konstante usw.) von dieser Einheit:
        • Ist die Symbolversion für den Import anders als das Symbol in der verwendeten Einheit? Wenn dies der Fall ist, muss die Neukompilierung durchgeführt werden.
  • Wenn DCU nicht gefunden wird, muss die Quelle gefunden und kompiliert werden, andernfalls Fehler bei der Kompilierung

Das wichtige Konzept ist das der Symbolversion . Beim Speichern einer DCU berechnet Delphi einen Hash basierend auf der Schnittstellendeklaration des Symbols und ordnet es dem Symbol zu. Andere Einheiten, die das Symbol verwenden, speichern auch die Symbolversion. Auf diese Weise werden Link-Zeit-Konflikte, die durch veraltete Symbole verursacht werden, im Gegensatz zu den meisten C-Linkern vermieden.

Daraus folgt, dass Sie in der Lage sein sollten, Classes.pas zu Ihrem Projekt hinzuzufügen und seinen Abschnitt implementation fast nach Herzenslust zu modifizieren und dennoch statisch Verknüpfung mit dem Rest der RTL- und VCL-Bibliotheken sowie Bibliotheken von Drittanbietern, auch wenn diese nur im Objektformat bereitgestellt werden.

Zu beachten:

  • Inline-Routinen; Der Körper der Inlined-Routinen ist Teil der Symbolversion
  • Generika; Die Implementierungsseite generischer Typen und Methoden ist Bestandteil der jeweiligen Symbolversionen
Barry Kelly 26.09.2009 23:12
quelle

Tags und Links