Френк задал такой вопрос:
Есть ли какой-нибудь способ узнать, какие интерфейсы (список интерфейсов) поддерживает определённый компонент (я не знаю интерфейсы, так что не могу запросить у него конкретные интерфейсы)?Да, способ есть.
Вызовите
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 интерфейса по интерфейсной ссылке.
ОтветитьУдалить