Создание 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 обнаружит ее в этом списке и запросит создание у той же «фабрики» — при этом новый экземпляр объекта будет создан в том же приложении. Другими словами, для создания всех объектов данного типа будет запущено не более одного экземпляра сервера. |
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, что избавит вас от лишней работы. |
![]() |
![]() |