Delphi и COM


         

Создание 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.


Содержание раздела