Иерархия классов Delphi, поддерживающих технологию COM и OLE


Общая иерархия классов Delphi, поддерживающих СОМ технологию имеет следующий вид.

TInterfacedObject — Определен в модуле System. Реализует интерфейс
IUnknown. Используется для реализации объектов внутри приложений.

TComObject — Определен в модуле ComObj. Реализует интерфейс IUnknown и ISupportEiTorlnfo. Используется для реализации объектов во внутренних СОМ-серверах (реализованных в виде D11). Имеет фабрику классов TComObjectFaetory, которая реализует интерфейсы IUnknown, IClassFactory и IClassFactory2.

TTypedComObject — Определен в модуле ComObj. Дополнительно реализует интерфейс IProvideClassInfo. Используется для реализации объектов локальных и удаленных СОМ-серверов (реализованных в виде Ехе). Имеет фабрику классов TTypedComObjectFactory.

TAutoObject — Определен в модуле ComObj. Дополнительно реализует интерфейс IDispatch. Фактически определяет дуальные интерфейсы. Используется для реализации объектов на внутренних, локальных и удаленных OLE-серверах. Имеет фабрику классов TAutoObjectFactory. Для создания таких серверов также следует создавать библиотеку типов с помощью соответствующего редактора.

TActiveXControl — Определен в модуле AxCtrls. Используется для реализации компонентов ActiveX. Имеет фабрику классов TActiveXControlFactory.

TActiveFormControl — Определен в модуле AxCtrls. Используется для реализации компонентов ActiveForm. Имеет фабрику классов TActiveFormFactory.

Переменные интерфейсного типа
Если вы объявляете переменную типа интерфейс, то эта переменная может ссылаться на экземпляры любого класса, реализующего интерфейс. Такие переменные позволяют вызывать методы интерфейса, не зная во время компиляции, где интерфейс реализован. Для получения указателя на интерфейс можно присвоить интерфейсной переменной экземпляр класса, реализующего интерфейс, использовать приведение типа или использовать метод Getlnterface класса TObject.

Intf:=MyObj; //Присвоение экземпляра
Intf:=TMyCIass.Create As IMylntf; // Приведение типа
Intf:=MyObj As IMylntf; // Приведение типа

• переменная типа интерфейс дает доступ только к методам и свойствам, объявленным в интерфейсе, но не к иным элементам класса реализации;

• переменная типа интерфейс не может ссылаться на объект, чей класс реализует интерфейс потомка, если этот класс (или тот, из которого он наследуется) не реализует и интерфейс предка тоже;

• использование оператора As приводит к побочному эффекту, заключающемуся в том, что он вызывает функцию _AddRef в начале работы с интерфейсом и функцию _Release по окончании работы. В результате объект уничтожается. Если в программе предусмотрен доступ с помощью экземпляра класса реализации и интерфейсной переменной, то с помощью экземпляра класса уже нельзя будет обратиться, поскольку объект уничтожен.

• Интерфейсные ссылки управляются через переменную FRefCount, значение которой зависит от методов _AddRef и _Release, унаследованных из IUnknown. Когда объект вызывается только через интерфейсы, не требуется уничтожать его вручную, поскольку он удалиться автоматически, когда исчезнет последняя ссылка к нему.

• Чтобы определить, ссылается ли выражение типа интерфейса на объект, следует обратиться к нему с помощью стандартной функции Assigned,которая возвращает False, если интерфейс не ссылается на объект.

• Классовый тип совместим с любым типом интерфейса, реализованным классом. Интерфейсный тип совместим с любым типом интерфейса предка. Значение Nil может быть определено любому интерфейсному типу.

• Выражение типа интерфейса может быть определено как Variant. Если интерфейс имеет тип IDispatch или его потомка, Variant получает значение типа varDispatch. Иначе, вариант получает значение типа varUnknown.

• Интерфейсные типы следуют тем же правилами что и классовые типы в переменных и привидениях типов. Выражения типа класса могут приводиться для связывания с интерфейсным типом, например:

IMyIntf(SomeObject); // Класс реализует интерфейс

Свойства интерфейсов
Помимо методов, описание интерфейса может включать и объявления свойств.
Синтаксис объявления свойства интерфейса:

Property <имя свойства>: <тип данных>
[Read <метод чтения>] [Write <метод записи>] [Default];

Примечания:
• Они доступны только через переменные интерфейсного типа.
• К свойствам нельзя обращаться, используя переменные типа класса.
• Свойства интерфейса видимы только внутри программ, где интерфейс компилируется.
• СОМ-объекты не имеют свойств, а компоненты ActiveX- имеют.
• В компонентах ActiveX свойства делятся на несколько групп: основные, внешние, расширенные и дополнительные.
• Так как интерфейс не может иметь полей, команды свойств Read и Write должны обращаться только к методам. Команды хранения свойств не разрешены, но свойство-массив может быть объявлено как Default.


Комментарии запрещены.




Статистика