Delphi предоставляет программисту великолепные возможности простого создания
СОМ-объектов. Для этого в среду Delphi были включены мастера (Wizards) для
создания разнообразных объектов СОМ. В этой главе вы узнаете, как создать
простой СОМ-объект при помощи мастера, а также как зарегистрировать созданный
объект и протестировать его
Delphi предоставляет программисту великолепные возможности простого создания
СОМ-объектов. Для этого в среду Delphi были включены мастера (Wizards) для
создания разнообразных объектов СОМ. В этой главе вы узнаете, как создать
простой СОМ-объект при помощи мастера, а также как зарегистрировать созданный
объект и протестировать его.
СОМ-объект может быть внутренним, локальным или удаленным сервером. Мастер
СОМ-объектов выполняет следующие шаги:
- Создает новый модуль в текущем проекте.
- Определяет новый класс, который является прямым потомком класса TCOMObject и
устанавливает конструктор фабрики класса.
Для разработчика процесс создания нового СОМ-объекта состоит из следующих шагов:
- Проектирование СОМ-объекта.
- Создание СОМ-объекта с использованием мастера.
- Регистрация СОМ-объекта.
- Тестирование СОМ-объекта.
Проектирование СОМ-объекта
При проектировании СОМ-объекта вы должны четко представлять, какие
СОМ-интерфейсы должны быть реализованы. Мастер по умолчанию предоставляет
интерфейс lunknown. Кроме того, вы обязаны определить, какой тип сервера вы
хотите использовать: внутренний, локальный или удаленный. Если вы проектируете
внутренний или локальный СОМ-сервер - вы должны подключить библиотеку типов, при
этом маршалинг будет произведен автоматически.
Мастера для создания СОМ-объектов
Как уже было отмечено выше, Delphi предоставляет разработчику несколько мастеров
для упрощения процесса генерации СОМ-объектов. В Delphi имеются мастера для
создания следующих объектов:
- простого СОМ-объекта;
- объекта автоматизации;
- элемента управления ActiveX;
- страниц активного сервера;
- форм ActiveX;
- библиотек ActiveX;
- страниц свойств;
- библиотек типов;
- объектов Microsoft Transaction Server (MTS).
Мастер автоматизирует задачи, характерные для создания каждого из
вышеперечисленных типов СОМ-объектов. Мастер обеспечивает необходимые интерфейсы
для каждого типа объекта. Для простого СОМ-объекта мастер предоставляет один
требуемый СОМ-интерфейс lunknown, который устанавливает указатель интерфейса в
объекте (рис. 3.8).
Для объекта автоматизации мастер создает два интерфейса: lunknown и IDispatch,
последний обеспечивает автоматический маршалинг (рис. 3.9).
![](/images/sustem/3.10.jpg)
![Рисунок 3.10](file:///C:/Documents%20and%20Settings/Admin/%D0%A0%D0%B0%D0%B1%D0%BE%D1%87%D0%B8%D0%B9%20%D1%81%D1%82%D0%BE%D0%BB/%D0%97%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%B8%D1%82%D1%8C%20%D0%BD%D0%B0%20%D1%81%D0%B0%D0%B9%D1%82/%D0%A1%D1%82%D0%B0%D1%82%D1%8C%D0%B8%20Delphi/images/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 и определить в нем необходимые методы. Для изменения уже существующего
интерфейса вам нужно создать его прямого потомка и модифицировать его по своему
усмотрению. Таким образом, непосредственное изменение уже существующих
интерфейсов для разработчика недоступно.
Создание СОМ-объекта с использованием мастера
Далее перечислены шаги, которые нужно выполнить для создания нового СОМ-объекта
с помощью мастера:
- Выберите в главном меню Delphi пункт File/New (Файл/Новый), при этом
откроется диалог добавления новых частей проекта (рис. 3.11).
- Выберите вкладку ActiveX в данном диалоговом окне.
- Дважды щелкните на иконке, изображающей СОМ-объект.
![](/images/sustem/3.11.jpg)
![Рисунок 3.11](file:///C:/Documents%20and%20Settings/Admin/%D0%A0%D0%B0%D0%B1%D0%BE%D1%87%D0%B8%D0%B9%20%D1%81%D1%82%D0%BE%D0%BB/%D0%97%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%B8%D1%82%D1%8C%20%D0%BD%D0%B0%20%D1%81%D0%B0%D0%B9%D1%82/%D0%A1%D1%82%D0%B0%D1%82%D1%8C%D0%B8%20Delphi/images/3.11.jpg)
Рис. 3.11. Диалоговое окно добавления новых частей
проекта
В результате вышеописанных действий, появится окно мастера
СОМ-объекта (COM Object Wizard), изображенное на рис. 3.12.
![](/images/sustem/3.12.jpg)
![Рисунок 3.12](file:///C:/Documents%20and%20Settings/Admin/%D0%A0%D0%B0%D0%B1%D0%BE%D1%87%D0%B8%D0%B9%20%D1%81%D1%82%D0%BE%D0%BB/%D0%97%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%B8%D1%82%D1%8C%20%D0%BD%D0%B0%20%D1%81%D0%B0%D0%B9%D1%82/%D0%A1%D1%82%D0%B0%D1%82%D1%8C%D0%B8%20Delphi/images/3.12.jpg)
Рис. 3.12. Мастер СОМ-объекта
Окно мастера СОМ-объекта содержит несколько полей ввода и флажков: - поле
Class Name (Имя класса) - определяет имя нового СОМ-объекта;
- поле Instancing (Экземпляры) - определяет способ создания СОМ-объекта,
данное поле может принимать любое из трех значений:
Internal (Внутренний) - объект может быть создан только внутри
процесса, внешнее приложение не может непосредственно создавать экземпляры
данного объекта. Примером такого способа создания СОМ-объекта может служить
текстовый процессор, который может содержать в качестве объекта документ,
который будет создаваться только путем вызова метода данного текстового
процессора.
Single Instance (Одиночный экземпляр) - допускает только один
СОМ-интерфейс для каждого приложения. Таким образом, когда какое-нибудь
приложение присоединяется к объекту, объект становится недоступным для остальных
приложений.
Multiple Instance (Множественный экземпляр) - объект может быть
подключен к нескольким приложениям. Всякий раз, когда клиент запрашивает услуги
сервера, создается новый экземпляр сервера. Например, каждый раз, когда
пользователь пытается открыть Windows Explorer, создается новый экземпляр
Проводника.
Примечание
Если СОМ-объект используется только внутри процесса, поле Instancing
(Экземпляры) игнорируется.
- поле Threading Model (Потоковая модель) - определяет, каким
образом приложения клиенты могут вызывать интерфейсы данного СОМ-объекта;
Примечание
О потоковых моделях читайте далее в этой главе.
- поле Implemented Interfaces (Реализуемые интерфейсы) - определяет
СОМ-интерфейсы, которые должны быть реализованы в СОМ-объекте;
- поле Description (Описание) - сюда вы можете поместить описание
вашего СОМ-объекта;
- флажок Include Type Library (Включать библиотеку типов) -
устанавливается в случае, если вы хотите создавать библиотеку типов для вашего
объекта. Установка данного флажка автоматически производит установку другого
флажка Mark interface Oleautomation (Отметить интерфейс Oleautomation);
- флажок Mark interface Oleautomation (Отметить интерфейс Oleautomation)
- устанавливается для активирования кода маршалинга. СОМ знает как осуществлять
маршалинг всех объектов, совместимых с сервером автоматизации, и устанавливает
прокси и заглушки автоматически.
Выбор модели потока
При создании нового СОМ-объекта с помощью мастера вам придется выбирать модель
потока. Правильный выбор модели потока улучшит работу вашего СОМ-объекта.
Табл. 3.5 кратко описывает модели потоков, возможные для СОМ-объектов.
Таблица 3.5. Модели потоков для СОМ-объектов
|
|
|
|
|
|
Модель потока
|
Описание
|
Преимущества и недостатки модели
|
|
|
Single
|
Без поддержки потоков. Запросы клиента
обрабатываются последовательно, один за другим
|
Клиенты обрабатываются в порядке
очереди, поэтому потоковой поддержки не требуется
|
|
|
Apartment
|
Клиенты могут вызывать методы объекта
только из того потока, в котором был создан сам объект. Разные
объекты одного сервера могут быть вызваны из разных потоков, но
каждый объект может быть вызван только из одного потока
|
Данные экземпляра находятся в
безопасности, глобальные данные должны быть защищены при помощи
критической секции или другим способом. Объекты просты в написании,
но написание кода клиента может быть достаточно трудным.
Первоначально использовалась для элементов управления обозревателей
Web
|
|
|
Free
|
Клиенты могут вызывать любые методы
объекта в любое время и из любых потоков. Количество потоков
неограничено
|
Нужно защищать все данные экземпляров и
глобальные данные объекта. Локальные переменные не надежны из-за
многочисленных вызовов. Клиенты просты в написании, но написание
кода объектов может вызывать трудности. Первоначально использовалась
для реализации технологии DCOM
|
|
|
Both
|
Объекты могут поддерживать клиентов,
которые используют модели Apartment или Free
|
Максимальная гибкость и улучшение работы
|
|
|
|
|
|
|
При взаимодействии обе части СОМ-приложения, клиент и сервер, сообщают о
поддерживаемой ими потоковой модели. СОМ сравнивает эти модели. Если обе части
описывают одну потоковую модель, СОМ устанавливает прямое соединение между
клиентом и сервером. Если потоковые модели клиента и сервера различаются, СОМ
использует маршалинг для установления связи между частями приложения. Применение
маршалинга снижает скорость выполнения работы, но преимущество очевидно:
маршалинг обеспечивает совместную работу приложений, использующих разные
потоковые модели.
Потоковая модель применима только для серверов внутри процесса. Локальные
серверы регистрируются как приложения ЕХЕ и самостоятельно обеспечивают
потоковую модель.
|