Мастера для создания СОМ-объектов
Как уже было отмечено выше, Delphi предоставляет разработчику несколько мастеров для упрощения процесса генерации СОМ-объектов. В Delphi имеются мастера для создания следующих объектов:
- простого СОМ-объекта;
- объекта автоматизации;
- элемента управления ActiveX;
- страниц активного сервера;
- форм ActiveX;
- библиотек ActiveX;
- страниц свойств;
- библиотек типов;
- объектов Microsoft Transaction Server (MTS).
Мастер автоматизирует задачи, характерные для создания каждого из вышеперечисленных типов СОМ-объектов. Мастер обеспечивает необходимые интерфейсы для каждого типа объекта. Для простого СОМ-объекта мастер предоставляет один требуемый СОМ-интерфейс lunknown, который устанавливает указатель интерфейса в объекте (рис. 3.8).
Для объекта автоматизации мастер создает два интерфейса: lunknown и IDispatch, последний обеспечивает автоматический маршалинг (рис. 3.9).
![](image/3-9.jpg)
Рис. 3.9. Объект автоматизации
![](image/3-10.jpg)
Рис. 3.10. Элемент управления ActiveX
Для элемента управления ActiveX мастер создает все требуемые для элемента управления интерфейсы, такие как lunknown, IDispatch, IOleobject, Iolecontrol и др. (рис. 3.10). Полный список интерфейсов, используемых элементом управления ActiveX, мы рассмотрим в главах 11 и 12.
Итак, различные мастера предоставляют различные интерфейсы. Вы можете выбрать тот мастер, который реализует необходимые для вашего СОМ-объекта интерфейсы. Табл. 3.4 показывает, какие интерфейсы предоставляют различные мастера.
Таблица 3.4. Интерфейсы, предоставляемые различными мастерами
Мастер |
Предоставляемые интерфейсы |
Действия, выполняемые мастером |
||
СОМ-сервер |
lUnknown |
Экспортирует необходимые программы, которые осуществляют регистрацию сервера, регистрацию класса, загрузку и выгрузку сервера и экземпляров объекта. Создает и управляет фабрикой класса для объектов, осуществленных в сервере. Указывает СОМ, какие потоковые модели используются для интерфейсов объекта. Обеспечивает библиотеку типов, если она требуется |
||
Сервер автоматизации |
lUnknown, IDispatch |
Выполняет все описанное для мастера СОМ-сервера, кроме того, обеспечивает интерфейс пользователя и автоматически обеспечивает библиотеку типов |
||
Элемент управления ActiveX |
lUnknown, IDispatch, IPersistStreamlnit, IQlelnPlaceActiveObject, IPer sis t Storage, IViewObject, IQleObject, IViewOb j ect2 , ZOleControl, IPerPropertyBrowsing, IQlelnPlaceObject, IspecifyPropertyPages |
Выполняет все описанное для мастеров, расположенных выше в этой таблице, кроме того, обеспечивает свойства, события и методы для всех интерфейсов TActiveXControl. Позволяет разработчику модифицировать объект в окне редактора кода |
||
Активные формы |
lUnknown, IDispatch, IPersistStreamlnit, lOlelnPlaceActiveObject, IPersistStorage, IViewObject, IQleObject, IViewOb ject2, IQleControl, IPerPropertyBrowsing, IGlelnPlaceObject, IspecifyPropertyPages |
Выполняет все описанное для мастера элемента управления ActiveX, кроме того, позволяет разработчику редактировать приложение |
||
Объект активный сервер |
lUnknown, IDispatch |
Выполняет все описанное для мастера сервера автоматизации и генерирует страничку с расширением ASP, которая может быть загружена в обозреватель Web. Мастер позволяет разработчику модифицировать свойства и методы объекта при помощи редактора библиотеки типов |
||
Библиотека ActiveX |
Нет |
Создает новую DLL для ActiveX или СОМ-сервера и обеспечивает все необходимые функции |
||
Страница свойств |
lUnknown, I PropertyPage |
Создает новую страницу свойств, которую разработчик может редактировать в редакторе форм |
||
Библиотека типов |
Нет |
Создает новую библиотеку типов и ассоциирует ее с активным проектом |
||
MTS-объект |
lobjectControl |
Добавляет новый модуль в текущий проект, который содержит объявление MTS-объекта |
||
Если вы хотите добавить собственный СОМ-объект, Delphi предоставляет вам такую возможность. Для создания нового интерфейса вы должны создать потомок интерфейса IDispatch и определить в нем необходимые методы. Для изменения уже существующего интерфейса вам нужно создать его прямого потомка и модифицировать его по своему усмотрению. Таким образом, непосредственное изменение уже существующих интерфейсов для разработчика недоступно.