Френк задал такой вопрос:
Есть ли какой-нибудь способ узнать, какие интерфейсы (список интерфейсов) поддерживает определённый компонент (я не знаю интерфейсы, так что не могу запросить у него конкретные интерфейсы)?Да, способ есть.
Вызовите
TObject.GetInterfaceTable для получения указателя на список интерфейсов, которые реализует конкретный класс - см. System.pas для подробностей. Заметьте, что этот список не будет включать в себя интерфейсы, которые вы реализуете вручную - замещением метода QueryInterface - но такая ситуация достаточно необычна для Delphi кода.К примеру, этот код демонстрирует, как вы можете сдампить все реализуемые классом интерфейсы:
program TestIntfTable;
{$APPTYPE CONSOLE}
uses
Classes,
SysUtils,
TypInfo,
ComObj;
procedure DumpInterfaces(AClass: TClass);
var
i : integer;
InterfaceTable: PInterfaceTable;
InterfaceEntry: PInterfaceEntry;
begin
while Assigned(AClass) do
begin
InterfaceTable := AClass.GetInterfaceTable;
if Assigned(InterfaceTable) then
begin
writeln('Implemented interfaces in ', AClass.ClassName);
for i := 0 to InterfaceTable.EntryCount-1 do
begin
InterfaceEntry := @InterfaceTable.Entries[i];
writeln(Format('%d. GUID = %s',
[i, GUIDToString(InterfaceEntry.IID)]));
end;
end;
AClass := AClass.ClassParent;
end;
WriteLn;
end;
begin
DumpInterfaces(TComponent);
DumpInterfaces(TComObject);
DumpInterfaces(TComObjectFactory);
readln;
end.
Вывод:
Implemented interfaces in TComponent
0. GUID = {E28B1858-EC86-4559-8FCD-6B4F824151ED}
1. GUID = {00000000-0000-0000-C000-000000000046}
Implemented interfaces in TComObject
0. GUID = {DF0B3D60-548F-101B-8E65-08002B2BD119}
1. GUID = {00000000-0000-0000-C000-000000000046}
Implemented interfaces in TComObjectFactory
0. GUID = {B196B28F-BAB4-101A-B69C-00AA00341D07}
1. GUID = {00000001-0000-0000-C000-000000000046}
2. GUID = {00000000-0000-0000-C000-000000000046}
Было бы великолепно если бы удалось узнать не только GUID но и описание (методы и свойства) интерфейса.
ОтветитьУдалитьСм. Простая RTTI информация интерфейсов и Расширенная RTTI информация интерфейсов, а также Хак №11: получение GUID интерфейса по интерфейсной ссылке.
ОтветитьУдалить