ГЛАВА 10

- Проектирование СОМ-объекта
  - Мастера для создания СОМ-объектов
  - Создание СОМ-объекта с использованием мастера
  - Выбор модели потока

Delphi предоставляет программисту великолепные возможности простого создания СОМ-объектов. Для этого в среду Delphi были включены мастера (Wizards) для создания разнообразных объектов СОМ. В этой главе вы узнаете, как создать простой СОМ-объект при помощи мастера, а также как зарегистрировать созданный объект и протестировать его.
СОМ-объект может быть внутренним, локальным или удаленным сервером. Мастер СОМ-объектов выполняет следующие шаги:
1. Создает новый модуль в текущем проекте.
2. Определяет новый класс, который является прямым потомком класса TCOMObject и устанавливает конструктор фабрики класса.
Для разработчика процесс создания нового СОМ-объекта состоит из следующих шагов:
1. Проектирование СОМ-объекта.
2. Создание СОМ-объекта с использованием мастера.
3. Регистрация СОМ-объекта.
4. Тестирование СОМ-объекта.
Проектирование СОМ-объекта
При проектировании СОМ-объекта вы должны четко представлять, какие СОМ-интерфейсы должны быть реализованы. Мастер по умолчанию предоставляет интерфейс lunknown. Кроме того, вы обязаны определить, какой тип сервера вы хотите использовать: внутренний, локальный или удаленный. Если вы проектируете внутренний или локальный СОМ-сервер - вы должны подключить библиотеку типов, при этом маршалинг будет произведен автоматически.
Мастера для создания СОМ-объектов
Как уже было отмечено выше, Delphi предоставляет разработчику несколько мастеров для упрощения процесса генерации СОМ-объектов. В Delphi имеются мастера для создания следующих объектов:
- простого СОМ-объекта;
- объекта автоматизации;
- элемента управления ActiveX;
- страниц активного сервера;
- форм ActiveX;
- библиотек ActiveX;
- страниц свойств;
- библиотек типов;
- объектов Microsoft Transaction Server (MTS).
Мастер автоматизирует задачи, характерные для создания каждого из вышеперечисленных типов СОМ-объектов. Мастер обеспечивает необходимые интерфейсы для каждого типа объекта. Для простого СОМ-объекта мастер предоставляет один требуемый СОМ-интерфейс lunknown, который устанавливает указатель интерфейса в объекте (рис. 3.8).
Для объекта автоматизации мастер создает два интерфейса: lunknown и IDispatch, последний обеспечивает автоматический маршалинг (рис. 3.9).
Рис. 3.9. Объект автоматизации
Рис. 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 и определить в нем необходимые методы. Для изменения уже существующего интерфейса вам нужно создать его прямого потомка и модифицировать его по своему усмотрению. Таким образом, непосредственное изменение уже существующих интерфейсов для разработчика недоступно.
Создание СОМ-объекта с использованием мастера
Далее перечислены шаги, которые нужно выполнить для создания нового СОМ-объекта с помощью мастера:
1. Выберите в главном меню Delphi пункт File/New (Файл/Новый), при этом откроется диалог добавления новых частей проекта (рис. 3.11).
2. Выберите вкладку ActiveX в данном диалоговом окне.
3. Дважды щелкните на иконке, изображающей СОМ-объект.
Рис. 3.11. Диалоговое окно добавления новых частей проекта
В результате вышеописанных действий, появится окно мастера СОМ-объекта (COM Object Wizard), изображенное на рис. 3.12.
Рис. 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 | Максимальная гибкость и улучшение работы |

При взаимодействии обе части СОМ-приложения, клиент и сервер, сообщают о поддерживаемой ими потоковой модели. СОМ сравнивает эти модели. Если обе части описывают одну потоковую модель, СОМ устанавливает прямое соединение между клиентом и сервером. Если потоковые модели клиента и сервера различаются, СОМ использует маршалинг для установления связи между частями приложения. Применение маршалинга снижает скорость выполнения работы, но преимущество очевидно: маршалинг обеспечивает совместную работу приложений, использующих разные потоковые модели.
Потоковая модель применима только для серверов внутри процесса. Локальные серверы регистрируются как приложения ЕХЕ и самостоятельно обеспечивают потоковую модель.
В следующих главах мы рассмотрим на конкретных примерах процесс создания СОМ-объектов.

Глава 9 Содержание Глава 11