Главная » Delphi » Внешние серверы COM

0

Внешние серверы (out of process  server)  COM представляют собой  исполняемые фай лы, которые могут создавать объекты COM для использования в других приложениях. Серверы этого  типа  называются внешними, поскольку  они  выполняются вне процес са клиента, а в контексте их собственного процесса.

Регистрация

Внешние серверы, как и их внутренние “родственники”, должны  быть  зарегист рированы в системном реестре. Для каждого  внешнего сервера должен  быть создан раздел  следующего  вида:

HKEY_CLASSES_ROOT\CLSID\{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx}

Полный путь к исполняемому файлу внешнего сервера должен быть описан в па

раметре LocalServer32 этого раздела.

Серверы   COM    приложений   Delphi     регистрируются   в    методе     Applica-

tion.Initialize(), который обычно вызывается в первой строке кода файла про 

екта приложения. Если при запуске приложения ему передается параметр командной

строки /regserver, то  метод  Application.Initialize() зарегистрирует классы COM в системном реестре и немедленно прекратит выполнение приложения. Точно так   же,   если   при   запуске   приложения  указывается  параметр  командной  строки

/unregserver,  то   метод   Application.Initialize() удалит  описание  классов COM из системного реестра и немедленно прекратит выполнение приложения. Если в командной строке не использован ни один из упомянутых  параметров, то метод Ap- plication.Initialize() зарегистрирует классы  COM в системном реестре и про должит  выполнение приложения в обычном режиме.

Создание экземпляра внешнего сервера  COM

В первом приближении процесс создания экземпляров объектов COM из внеш него  сервера напоминает аналогичную процедуру  для внутреннего сервера — доста точно просто вызвать функцию  CreateComObject(), определенную в модуле Com- Obj. Однако, по сути, эти процессы абсолютно не похожи. В данном  случае функция CoGetClassObject() просматривает системный реестр в поисках параметра Lo- calServer32 и  вызывает соответствующее приложение,  используя  функцию  API Win32   CreateProcess().  При   запуске   внешнего  приложения сервера  последнее должно  зарегистрировать свои фабрики классов, используя функцию API COM CoRegisterClassObject(). Данная  функция добавляет указатель  на интерфейс IClassFactory во  внутреннюю таблицу  зарегистрированных  активных объектов классов  COM.  В результате  функция  CoGetClassObject() получит   возможность выбрать из этой  таблицы необходимый указатель  IClassFactory для создания тре буемого экземпляра объекта COM.

Агрегация

Итак, основными строительными блоками  модели  COM  являются интерфейсы. Кроме  того,  возможно наследование интерфейсов. Однако интерфейсы представля ют собой  сущности, не имеющие реализации. Что  же произойдет, если  необходимоорганизовать реализацию одного  объекта COM внутри другого? Для ответа на данный вопрос в COM существует  концепция агрегации (aggregation). Под  агрегацией подра зумевается, что  содержащий (внешний) объект создает  содержащийся (внутренний) объект как часть процесса своего  создания, при этом интерфейсы внутреннего объек та предоставляются клиентам внешним объектом. Объект должен  позволить работать с собой  как с неким  агрегатом, предоставив средства перенаправления всех вызовов его  методов  IUnknown содержащему  его  внешнему   объекту.   Примером  агрегации объектов COM в контексте библиотеки VCL может служить класс Taggregated- Object в модуле AxCtrls.

Источник: Тейксейра, Стив, Пачеко, Ксавье.   Borland Delphi 6. Руководство разработчика. : Пер.  с англ. — М. : Издательский дом “Вильямс”, 2002. —  1120 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии