AGB  ·  Datenschutz  ·  Impressum  







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

TGUID von Interface-Instanz herausfinden

Ein Thema von TiGü · begonnen am 7. Mai 2014 · letzter Beitrag vom 12. Mai 2014
 
Benutzerbild von himitsu
himitsu

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

AW: TGUID von Interface-Instanz herausfinden

  Alt 7. Mai 2014, 17:21
Ich weiß jetzt auch nicht, wie das geht ... ich hab fast die Befürchtung, daß es nicht geht.
Abgesehn davon daß Interfaces im Delphi nichtmal eine IID haben müssen.

Aber du kannst dir das Objekt aus dem Interface ziehen (solange sich dahinter ein Delphi-Objekt versteckt), von dem listet man alle Interfaces auf,
holt sich über QueryInterface Instanzen dieser Interfaces, vergleicht die Instanzzeiger und würde so das passende finden.


[edit]
OK, anhand der Adresse des Index (Offset zur Objektinstanz) könnte man es auch direkt versuchen, aber das funktioniert dann doch vermutlich ebenfalls nur bei Interfaces?
Ich vermute mal an/ab den Adressen stehen jeweils die Pointer zu den Methoden der Interfaces.
Delphi-Quellcode:
type
  IMyIntfA = interface
    ['{12082AEC-4031-481B-A0AE-5EC82EABD13F}']
    procedure ProcA;
  end;
  IMyIntfB = interface
    ['{B82BC941-C831-451E-ACCC-E957CD9CBEFA}']
    procedure ProcA;
    procedure ProcB;
  end;
  IMyIntfC = interface
    procedure ProcA;
  end;

  TMyClass = class(TInterfacedObject, IMyIntfA, IMyIntfB, IMyIntfC)
    procedure ProcA;
    procedure ProcB;
  end;

procedure TMyClass.ProcA;
begin
end;

procedure TMyClass.ProcB;
begin
end;

var
  O, X: TMyClass;
  A, B, C, D, E: IInterface;
  P, Q: Pointer;
begin
  O := TMyClass.Create;
  A := O as IMyIntfA;
  B := O as IMyIntfB;
  C := O as IMyIntfC;
  D := B as IMyIntfA;
  B.QueryInterface(IMyIntfA, E); // E := B as IMyIntfA;
//F := B as IMyIntfC; // [dcc32 Fataler Fehler] Unit14.pas(2022): F2084 Interner Fehler: C13823
//B.QueryInterface(IMyIntfC, F); // [dcc32 Fehler] Unit14.pas(890): E2232 Interface 'IMyIntfC' besitzt keine Interface-Identifikation
  X := A as TMyClass;
//P := @IMyIntfB(B).ProcA;
//Q := @IMyIntfB(B).ProcB;
  ShowMessage(
    'O = ' + IntToHex(Integer(O), 8) + sLineBreak +
    'A = ' + IntToHex(Integer(A), 8) + sLineBreak +
    'B = ' + IntToHex(Integer(B), 8) + sLineBreak +
    'C = ' + IntToHex(Integer(C), 8) + sLineBreak +
    'D = ' + IntToHex(Integer(D), 8) + sLineBreak +
    'E = ' + IntToHex(Integer(E), 8) + sLineBreak +
    'X = ' + IntToHex(Integer(X), 8) + sLineBreak);

O = $15333E40
A = $15333E54 (A) O+20
B = $15333E50 (B) O+16
C = $15333E4C (C) O+10
D = $15333E54 (A)
E = $15333E54 (A)
X = $15333E40
Delphi-Quellcode:
O = $14A30080
A = $14A30094 $1BEB4B70 - $00000000 $14A2FE80 $000204B0
B = $14A30090 $1BEB4B5C $1BEB4B70 - $00000000 $14A2FE80
C = $14A3008C $1BEB4B4C - $1BEB4B5C $1BEB4B70 $00000000
D = $14A30094
E = $14A30094
X = $14A30080
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 7. Mai 2014 um 18:22 Uhr)
  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 09:56 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