среда, 20 июля 2011 г.

Получение списка реализуемых интерфейсов

Это перевод Getting a list of implemented interfaces. Автор: Hallvard Vassbotn.

Френк задал такой вопрос:
Есть ли какой-нибудь способ узнать, какие интерфейсы (список интерфейсов) поддерживает определённый компонент (я не знаю интерфейсы, так что не могу запросить у него конкретные интерфейсы)?
Да, способ есть.

Вызовите 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}

2 комментария:

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.