Интерфейсы автоматизации, диспинтерфейсы

В блоке System Delphi объявлен также и IDispatch интерфейс, предназначенный для поддержки объектов автоматизации (Automation). Таким образом, любое приложение, предоставляющее свои внутренние методы другим приложениям, может осуществлять это через этот интерфейс.

Работает IDispatch интерфейс медленнее обычных. С его помощью можно обращаться

Диспинтерфейсы

IDispatch — это обычный интерфейс, реализованный с помощью VMT таблицы указателей на его методы. Его основной особенностью является наличие метода Invoke, используемого для вызова других методов интерфейса. Для обеспечения этого определяются специальные Dispatch интерфейсы, для реализации которых VMT таблица не используется. Их часто называют диспинтерфейсами (Dispinterface). Вызов их методов осуществляется с помощью уникального целочисленного идентификатора DispID, присваиваемого методам и свойствам диспинтерфейсов.

Таким образом, диспинтерфейс определяет методы и свойства, которые объект Automation выполняет через этот интерфейс, а вызов диспинтерфейса осуществляется с помощью метода IDispatch.Invoke — метода времени выполнения.
Объявление типа диспинтерфейса имеет следующий синтаксис:

Туре <имя интерфейса >=Dispinterface
[‘{GUID}’] //Global Unique IDentifier
<Определение интерфейса> //Объявление методов и свойств
End;

Примечания:
• Объявление диспинтерфейсов похоже на объявления простых интерфейсов, но не может содержать предка в своем объявлении.
• Диспинтерфейсы имеют тот же GUID, что и IDispatch интерфейсы.
• Классы не реализуют диспинтерфейсы.
• Объявление методов и свойств должно сопровождаться командой DispID с указанием целочисленной константы, которая должна быть уникальной в пределах объявления интерфейса. При самостоятельном указании константы следует использовать положительные значения. Отрицательные значения зарезервированы Windows.
• Свойства, параметры и типы результатов методов должны быть: Byte, Currency, Real, Double, Longlnt, Integer, Single, Smalllnt, AnsiString, WideString, TDateTime, Variant, OleVariant, WordBool, интерфейсный тип.
• Свойства интерфейса Dispatch не включают команд доступа, но они могут быть объявлены как ReadOnly или WriteOnly. Свойства-массивы могут быть объявлены как Default. Все опции указываются через разделитель ;.
• Свойства и методы могут быть указаны в определении диспинтерфейса вперемежку друг с другом.

Туре IStringsDisp=Dispinterface
[‘{EE05DFE2-5549-11D0-9EA9-0020AF3D82DA}’]
Property ControlDefault[Index: Integer]: OleVariant DispID 0; Default;
Function Count: Integer; DispID 1;
Property Item [Index: Integer]: OleVariant DispID 2;
Procedure Remove(Index: Integer); DispID 3; End;

Вызов методов диспинтерфейса с помощью метода Invoke несколько быстрее, чем при использовании переменной типа Variant, поскольку не требуется выяснения имени нужного метода, вследствие использования DispID.

Дуальные интерфейсы

Интерфейсы, наследуемые от IDispatch интерфейса, называют дуальными (Dual) интерфейсами. Как правило, при создании объектов автоматизации Delphi автоматически создает именно дуальные интерфейсы и соответствующие им диспинтерфейсы. Таким образом, у вас появится несколько возможностей для вызова методов: используя VMT таблицу IDispatch интерфейса или его наследника или с помощью метода Invoke, который вызывает методы диспинтерфейса, поддерживаемого Delphi.

Примечания:
• Методы дуальных интерфейсов, исключая унаследованные от IUnknoun и IDispatch, должны иметь safecall соглашение о вызовах.
• Свойства, параметры и типы результатов методов должны быть automatable типов: Byte, Currency, Real, Double, Real48, Integer, Single, Smallint, AnsiString, ShortString, TDateTime, Variant, OleVariant, and WordBool.
• Дуальные интерфейсы могут содержать объявление свойств. Свойства могут иметь команды доступа Read и/или Write, которые должны обращаться только к методам, ранее объявленным в описании интерфейса.

Использование интерфейсов в Delphi

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

Общая иерархия классов Delphi, поддерживающих СОМ технологию
Рис. Общая иерархия классов 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.

Класс поддержки

На уровне класса TComponent реализована поддержка интерфейса IUnknown — определены методы _AddRef, _Release и Querylnterface. Таким образом, любой компонент Delphi поддерживает интерфейс IUnknown.

Querylnterface позволяет запрашивать (вызывать) интерфейсы объектов после получения указателя на объект-сервер.

_AddRef и _Release обеспечивают работу механизма учета ссылок интерфейса.

Класс TInterfacedObject реализует интерфейс IUnknown. Поэтому TlnterfacedObject объявляет и реализует каждый из трех методов интерфейса IUnknown.

TInterfacedObject=Class(TObject, IUnknown)
Protected
FRefCount: Integer;
Function QueryInterface(Const IID: TGUID; Out Obj): HResult; stdcall;
Function AddRef: Integer; stdcall;
Function JRelease: Integer; stdcall;
Public
Procedure AfterConstruction; Override;
Procedure BeforeDestruction; Override;
Class Function New-Instance: TObject; Override;
Property RefCount: Integer Read FRefCount;
End;


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





Статистика

Рейтинг@Mail.ru