Создание COM-сервера
Для создания COM-сервера Delphi предоставляет широкий набор мастеров, автоматизирующих выполнение рутинных задач и позволяющих программисту сконцентрироваться на реализации функциональности. Мастера доступны при помощи команды меню File->New, на закладке ActiveX.
Чтобы сделать COM-сервером EXE-файл, необходимо просто добавить в него модуль с COM-объектом. Для создания COM-сервера в виде DLL потребуется сначала создать библиотеку, оформленную с учетом требований COM. Это делается при помощи мастера ActiveX Library. При его выборе будет создан новый проект, реализующий DLL, и сгенерирован следующий код:
library Project1;
uses ComServ;
exports DllGetClassObject, DllCanUnloadNow, DllRegisterServer, DllUnregisterServer;
{$R *.RES}
begin end.
Созданная DLL экспортирует функции, необходимые для работы COM, при этом можно не отвлекаться на рутинную работу и сразу приступить к реализации COM-сервера.
Для этого выберите мастер «COM-объект».
От заполнения полей этой формы зависит реализация создаваемого COM-объекта:
ClassName |
Имя класса Delphi, реализующего COM-сервер. Мастер создаст заготовку класса с этим именем, под которым COM-сервер также будет зарегистрирован в реестре. |
Instansing |
Определяет режим создания COM-объектов. Параметр может принимать следующие значения: |
Internal
|
— объект может использоваться только внутри этого приложения;
|
Single Instance |
— создание каждого экземпляра объекта приводит к запуску нового экземпляра приложения-сервера. После создания объекта «фабрика объектов» приложения удаляет информацию о себе из системного списка зарегистрированных «фабрик», что заставляет COM при создании нового объекта запустить приложение-сервер в новом процессе;
|
Multiple Instance
|
после создания экземпляра объекта «фабрика» не удаляет себя из списка зарегистрированных. При создании запросе на создание нового объекта COM обнаружит ее в этом списке и запросит создание у той же «фабрики» — при этом новый экземпляр объекта будет создан в том же приложении. Другими словами, для создания всех объектов данного типа будет запущено не более одного экземпляра сервера.
|
Этот параметр имеет смысл только для EXE-серверов, для DLL он игнорируется.
Threading Model |
Потоковая модель сервера. Действие этого параметра зависит от типа сервера (EXE или DLL): |
Single |
— нет никакой поддержки потоков. Для DLL-сервера при регистрации не будет создан параметр ThreadingModel. Для EXE-сервера указание этого параметра (в отличие от любого другого) не приведет к установке флага IsMultiThread, а будет создана STA. Обычно эта модель используется для Internal-серверов; |
Apartment |
— для DLL-сервера в реестре будет создан параметр ThreadingModel= Apartment, для EXE — создана STA; |
Free |
— для DLL-сервера в реестре будет создан параметр ThreadingModel= Free, для EXE — создана MTA; |
Both |
— для DLL-сервера в реестре будет создан параметр ThreadingModel= Both, для EXE — создана MTA. |
Include Type Library |
Установка этого флажка приводит к включению в сервер библиотеки типов — специального двоичного ресурса, описывающего реализуемые сервером интерфейсы, их методы и параметры вызова. COM предоставляет стандартные средства работы с библиотеками типов. В частности, Delphi может импортировать имеющуюся в сервере библиотеку типов и автоматически построить по ней интерфейсный модуль для работы с ним. При использовании библиотеки типов интерфейсы описываются при помощи Type Library Editor. Объект наследуется от TTypedComObject Если этот флажок выключен, то объект наследуется от TComObject. Это более «легковесная» реализация сервера. |
Description |
Примечание к объекту. |
Implemented Interfaces |
Это поле разрешено, только если объект не использует библиотеку типов. В таком случае вы должны сами описать интерфейсы в коде своей программы и перечислить их в этом поле, например «ITest, IAnotherTest». |
Mark interface Oleautomation |
Установка этого флага делает COM-сервер совместимым с OLE Automation. Вы должны использовать в методах интерфейса только совместимые с OLE Automation типы данных. Это необходимо, если вы хотите передавать ссылку на интерфейс между разными «комнатами». Такая операция, называемая маршалингом интерфейсов, требует написания специальной proxy/stub-DLL. Однако если интерфейс помечен как OleAutomation, то эту работу выполнит маршалер OLE, что избавит вас от лишней работы. |
Для поддержки OleAutomation-маршалинга необходимо:
- чтобы сервер был унаследован от TTypedComObject (реализация IDispatch не обязательна);
- все методы интерфейса были объявлены как safecall. Если вы создаете интерфейс, унаследованный от IUnknown, то по умолчанию все его методы объявляются как stdcall. Чтобы создать safecall-методы, необходимо в диалоге Tools>Environment Options на закладке Type Library установить переключатель Safecall function mapping в значение All v-table interfaces.
Содержание раздела