Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

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

AW: TGUID von Interface-Instanz herausfinden

  Alt 7. Mai 2014, 18: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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 7. Mai 2014 um 19:22 Uhr)
  Mit Zitat antworten Zitat