Delphi и COM


         

Активация сервера


Для активации COM-сервера клиент должен вызвать функцию CreateComObject, описанную в модуле ComObj.pas:

function CreateComObject(const ClassID: TGUID): IUnknown;

Функция получает в качестве параметра CLSID требуемого объекта и возвращает ссылку на его интерфейс IUnknown. Далее клиент может запросить требуемый интерфейс и работать с ним:

var COMServer: IComServer; …   // Создаем COM-объект и запрашиваем у него интерфейс   ComServer := CreateComObject(IComServer) as IComServer;   // Работаем с интерфейсом   ComServer.DoSomething;   // Освобождаем интерфейс   ComServer := NIL;

Что же делает COM при запросе на создание сервера?

  1. В реестре по запрошенному CLSID ведется поиск записи регистрации сервера.
  2. Из этой записи получается имя исполнимого модуля сервера.
  3. Если это исполнимый файл, то он запускается на выполнение. Любое приложение, реализующее COM-сервер, при старте регистрирует в системе интерфейс «фабрики объектов». После запуска и регистрации COM получает ссылку на «фабрику объектов».
  4. Если это DLL, то она загружается в адресное пространство вызвавшего процесса  и вызывается ее функция DllGetClassObject, возвращающая ссылку на реализованную в DLL «фабрику объектов».
  5. Фабрика объектов — это COM-сервер, реализующий интерфейс IClassFactory. Ключевым методом этого интерфейса является метод CreateInstance, который и создает экземпляр требуемого объекта.
  6. COM вызывает метод CreateInstance и передает полученный интерфейс клиенту.

По завершении работы с COM-объектом клиент освобождает ссылку на него (что приводит к вызову метода Release). В этот момент COM-сервер проверяет, есть ли еще ссылки на созданные им объекты. Если все объекты освобождены, то COM-сервер завершает свою работу. В случае если он реализован в виде DLL, он должен экспортировать функцию DllCanUnloadNow, которая вызывается COM по таймеру или при вызове функции API CoFreeUnusedLibraries. Если все объекты из этой DLL освобождены, она выгружается из памяти.

Вся работа по созданию и регистрации «фабрики объектов» и экспорту соответствующих функций из DLL в Delphi уже реализована в составе стандартных библиотек, и создание COM-сервера в действительности является очень простой задачей.



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