probiere mal
Delphi-Quellcode:
type
IIntfTbl =
Interface
['
{C93CB029-F127-493C-9A65-8C5E446BE830}']
function SupportsInterface(
Index: Integer;
out GUID: TGUID): Bool;
stdcall;
end;
function TXyz.SupportsInterface(
Index: Integer;
out GUID: TGUID): Bool;
stdcall;
var
Table: PInterfaceTable;
Class: TClass;
begin
Result := False;
Class := ClassType;
while (
Index >= 0)
and (
Class <>
nil)
do
begin
Table :=
Class.GetInterfaceTable;
if Table <>
nil then
if Index < Table.EntryCount
then
begin
Move(Table.Entries[
Index],
GUID, SizeOf(TGUID));
Result := True;
Exit;
end else Dec(
Index, Table.EntryCount);
Class :=
Class.ParentClass;
end;
end;
procedure Test;
var
I: Integer;
IntfTbl: IIntfTbl;
GUID: TGUID;
begin
I := 0;
if IUnknown.QueryInterface(IIntfTbl, IntfTbl) = S_OK
then
while IntfTbl.SupportsInterface(I,
GUID)
do
begin
..... tue was mit
GUID
Inc(I);
end;
end;
Du baust dir quasi eine einfache Iteriermethode die dir alle unterstützten GUIDs aller Klassen der Vererbungshierarchie zurückgibt.
Ein Zugriff direkt auf die
RTTI's über Modulgrenzen hinweg ist eine sehr sehr schlechte Idee, dh. den Zeiger auf die PInterfaceTable zurückzugeben ist kontraproduktiv.
Gruß Hagen