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