Для активации 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 при запросе на создание сервера?
По завершении работы с COM-объектом клиент освобождает ссылку на него (что приводит к вызову метода Release). В этот момент COM-сервер проверяет, есть ли еще ссылки на созданные им объекты. Если все объекты освобождены, то COM-сервер завершает свою работу. В случае если он реализован в виде DLL, он должен экспортировать функцию DllCanUnloadNow, которая вызывается COM по таймеру или при вызове функции API CoFreeUnusedLibraries. Если все объекты из этой DLL освобождены, она выгружается из памяти.
Вся работа по созданию и регистрации «фабрики объектов» и экспорту соответствующих функций из DLL в Delphi уже реализована в составе стандартных библиотек, и создание COM-сервера в действительности является очень простой задачей.
![]() |
![]() |