- •Изучение способов разработКи простейших com-объектов в среде delphi.
- •5.6 Методические указания.
- •5.6.1 Основные сведения о сом-объектах
- •5.6.2 Составляющие com-приложений
- •5.6.2.1 Способы взаимодействия com-клиентов с com-серверами
- •5.6.2.2 Регистрация com-сервера
- •5 .6.2.3 Библиотека com
- •1.6.2.4 Hresult.
- •5.6.2.5 Библиотека типов.
- •5.6.2.6 Общие сведения о com-клиентах
- •5.6.3 Объекты com в среде Delphi.
- •5.6.3.1 Средства реализации интерфейсов в среде Delphi.
- •5.6.3.2 Классы TcomObj, Coclass и tTypedComObject.
- •5.6.3.3 Пример простейшего приложения с применением интерфейсов.
- •ShowMessage(MyInterface.GetName);
- •5.6.4 Разработка структуры клиентского и серверного приложений.
- •5.6.5 Создание внутреннего сервера сом.
- •5.6.5.1 Создание динамической библиотеки.
- •5.6.5.2 Создание объекта сом.
- •5.6.5.3 Создание интерфейсов объекта сом.
- •5.6.5.4 Задание кода методов интерфейса.
- •5.6.6 Разработка клиентского приложения для внутреннего сервера
5.6.2.6 Общие сведения о com-клиентах
СОМ-клиенты. Очень важным при разработке СОМ-приложений является создание приложений, называемых СОМ-клиентами, которые могут запрашивать интерфейсы объектов, чтобы определить те услуги, которые может предоставить СОМ-объект. Типичным СОМ-клиентом является диспетчер автоматизации (Automation Controller). Диспетчер автоматизации - это часть приложения, которая знает какой тип информации необходим ему от разных объектов сервера, и она запрашивает данную информацию по мере надобности.
Существуют два способа обращения к методам и свойствам СОМ-объекта: путем ссылки на его библиотеку типов (раннее связывание) и по имени (позднее связывание). Стандарт COM основан на едином для всех поддерживающих его языков формате таблицы, описывающей ссылки на методы объекта, реализующего интерфейс. Однако вызов методов при помощи этой таблицы доступен только для компилирующих языков программирования. Кроме того, базовый язык обращения к серверам Microsoft Office - Visual Basic for Application (VBA) не поддерживает работу с указателями и, следовательно, не может использовать интерфейсы. Специально для такого рода языков (помимо VBA c указателями не работают также языки JavaScript, SmallTalk и некоторые другие) в технологию СОМ введены диспинтерфейсы, позволяющие обращаться к методам и свойствам по имени, а не по адресу. Для поддержки этих языков была разработана технология автоматизации (automation, ранее она называлась OLE Automation), позволяющая приложениям делать свою функциональность доступной для гораздо большего числа клиентов.
5.6.3 Объекты com в среде Delphi.
5.6.3.1 Средства реализации интерфейсов в среде Delphi.
В
Delphi 2 интерфейсы OLE были реализованы с
помощью модуля OLE2.PAS. В целях совместимости
этот модуль был сохранен и в Delphi 3.
Одним из наиболее важных нововведений, начиная с Delphi 3, стала поддержка интерфейсов. Сейчас весь новый код следует писать на основе модуля ActiveX.PAS и класса TInterfacedObject. А базовые средства для работы с COM-объектами определены теперь в модуле SYSTEM.PAS.
В частности, тип записи, соответствующий GUID в этом модуле определен следующим образом (рис. 5. ):
З
десь
же определены записи, определяющие
структуры интерфейсов (рис. 5.
и рис. 5. ):
Базовый интерфейс IUnknown в Delphi 6.0 определен в модуле SYSTEM.PAS следующим образом (рис 5. ):
К
ак
видно, синтаксис определения интерфейса
очень похож на синтаксис определения
класса. Основное отличие заключается
в том, что интерфейс может быть связан
с GUID. Кроме того, если в младших версиях
Delphi интерфейс Iunknown
определялся непосредственно, то теперь
он определяется через синоним Iinterface.
О
пределение
пользовательского интерфейса аналогично
определению пользовательских классов
Delphi. Например, на Delphi реализация
рассмотренного выше пользовательского
интерфейса IspellChecker,
обеспечивающего доступ к методам
проверки орфографии, может выглядеть
так, как показано на рис 5.
:
Р
Для
получения нового GUID
в интегрированной среде разработчика
Delphi необходимо набрать комбинацию
клавиш <Ctrl+Shift+G> в окне редактора
кода Code Editor.
Е
сли
предком данного интерфейса является
IUnknown, то в его объявлении допускается
опускать имя предка, аналогично тому,
как это делается при объявлении нового
класса в случае, если его предком является
Tobject
(рис. 5.
):
Интерфейсы в Delphi реализуются через классы. На уровне класса TObject определен метод Getlnterface, который возвратит указатель на интерфейс (если он поддерживается). На уровне класса TComponent реализована поддержка lUnknown - определены методы AddRef, Release и Querylnterface. Любой компонент Delphi поддерживает lUnknown. Прямой потомок TObject - класс TInterfacedObject - так же поддерживает lUnknown. Реализацию интерфейса обычно производят в TInterfacedObject или в других объектах, где отчасти реализованы методы интерфейсов, однако, при необходимости, интерфейс можно реализовать в любом классе Delphi.
К
ласс
интерфейсных объектов TinterfacedObject
для Delphi
6.0 определен в модуле SYSTEM.PAS следующим
образом (рис 5.
):
Р
Type
TEditor
= class(TInterfacedObject, Iedit,
Iformat,
IspellChecker)
{
методы
интерфейсов
Iedit,
Iformat
и
IspellChecker
}
end;
Разумеется, интерфейсы Iedit, Iformat и IspellChecker должны быть предварительно определены.
К
TInterfacedClass
= class of TInterfacedObject;
В Delphi 4 появилась новая директива implements, позволяющая делегировать реализацию методов интерфейса другим классам или интерфейсам. Она используется как последняя директива свойства класса или интерфейса. Она позволяет использовать интерфейс, уже реализованный в каком-либо классе, для реализации интерфейса в другом классе.
