Основы COM. Рудалев В.Г - 7 стр.

UptoLike

7
При доступе с помощью VTable клиентской программе необходима библиотека
типов (БТ). Это модуль, содержащий описания всех интерфейсов , объявления
констант, обозначающих GUID интерфейсов и классов и др. БТ пишется либо
на специальном языке описания интерфейсов IDL, либо на используемом языке
программирования. В случае использования Delphi БТ хранится в файле с
расширением *.pas и должна быть подключена директивой Uses.
Однако первоочередной задачей является поиск серверов по запросу клиента .
Поиск осуществляется по базе данных, записанной в реестре Windows в разделе
HKEY_CLASSES_ROOT\CLSID. Для каждого сервера прописывается его ме-
стонахождение - локальный или сетевой путь . Таким образом, клиентское при -
ложение не должно беспокоиться о поиске сервера , достаточно зарегистриро -
вать его на компьютере и COM автоматически найдет и загрузит нужный мо-
дуль. Кроме этого, объект может зарегистрировать свое «дружественное» имя
PROGID. Обычно оно формируется как комбинация имени сервера и имени
объекта , например « Excel.Application» . Ветка реестра с этим именем содержит
ссылку на CLSID объекта , откуда COM получает необходимую информацию.
Внешние и удаленные серверы автоматически регистрируются при первом за-
пуске программы на компьютере . Для регистрации внутренних серверов слу -
жит утилита Regsvr32.exe, поставляемая в составе Windows.
Для вызова активации COM-сервера клиент может использовать функцию
CreateComObject, описанную в модуле ComObj.pas:
function CreateComObject(const ClassID: TGUID): IUnknown;
Параметром здесь является CLSID требуемого объекта , результатом - ссылка на
его интерфейс IUnknown. Далее клиент может запросить требуемый интер-
фейс и работать с ним. CreateComObject функция Delphi, внутри кото -
рой происходит вызов функции COM API CoCreateInstance.
Функция CreateComObject обращается к системному реестру , по иденти -
фикатору класса находит информацию о местонахождении сервера и запускает
его. Сервер с помощью фабрики классов (Class Factory) создает экземпляр клас-
са объект и возвращает указатель на запрошенный интерфейс (т.е. указатель
на VTable), увеличивая на единицу счетчик ссылок. Этот указатель передается
клиенту , который по смещению в VTable находит нужный метод .
Все COM-объекты создаются фабриками классов . Каждый COM-класс имеет
соответствующую фабрику , отвечающую за создание объектов этого класса .
Фабрика классов это COM-объект, реализующий интерфейс
IClassFactory. Ключевым методом этого интерфейса является метод
CreateInstance, который и создает экземпляр требуемого объекта . COM
вызывает метод CreateInstance и передает полученный интерфейс клиен-
ту . Интерфейс фабрики классов создается автоматически для всех COM-
серверов и при их старте регистрируется в системе. После запуска и регистра -
ции COM сразу получает ссылку на фабрику классов .
1.3. Обращение к интерфейсам
                                           7
При д оступеспомощ ью VTable кли ентской программенеобход и ма б и б ли оте ка
ти п ов (БТ). Э то мод уль, сод ерж ащ и й опи сани я в сех и нтерфей сов , объяв лени я
констант, обоз начаю щ и х GUID и нтерфей сов и классов и д р. БТ пи ш ется ли бо
на специ альном яз ы кеопи сани яи нтерфей сов IDL, ли бо на и спольз уемом яз ы ке
программи ров ани я. В случае и спольз ов ани я Delphi БТ храни тся в фай ле с
расш и рени ем *.pas и д олж на бы ть под клю чена д и ректи в ой Uses.
О д нако первоочеред ной з ад ачей яв ляется пои сксерверов по з апросу кли ента.
Пои скосущ еств ляетсяпо баз ед анны х, з апи санной в реестреWindows в раз д еле
HKEY_CLASSES_ROOT\CLSID. Д ля каж д ого сервера пропи сы в ается его ме-
стонахож д ени е - локальны й и ли сетев ой путь. Т аки м образ ом, кли ентское при -
лож ени е не д олж но беспокои ться о пои ске сервера, д остаточно з ареги стри ро-
в ать его на компью тере и COM ав томати чески най д ет и з агруз и т нуж ны й мо-
д уль. К роме этого, объект мож ет з ареги стри ров ать св ое «д руж еств енное» и мя
PROGID. О бы чно оно форми руется как комби наци я и мени сервера и и мени
объекта, напри мер«Excel.Application» . В етка реестра с эти м и менем сод ерж и т
ссы лку на CLSID объекта, откуд а COM получает необход и мую и нформаци ю .
В неш ни е и уд аленны е серверы ав томати чески реги стри рую тся при первом з а-
пуске программы на компью тере. Д ля реги страци и в нутренни х серверов слу-
ж и тути ли та Regsvr32.exe, постав ляемаяв состав еWindows.
Д ля в ы з ов а акти в аци и COM-сервера кли ент мож ет и спольз ов ать функци ю
CreateComObject, опи санную в мод улеComObj.pas:
function CreateComObject(const ClassID: TGUID): IUnknown;
Параметром з д есь яв ляетсяCLSID требуемого объекта, рез ультатом - ссы лка на
его и нтерфей с IUnknown. Д алее кли ент мож ет з апроси ть требуемы й и нтер-
фей с и работать с ни м. CreateComObject – функци я Delphi, в нутри кото-
рой прои сход и тв ы з ов функци и COM API CoCreateInstance.
Ф ункци я CreateComObject обращ ается кси стемному реестру, по и д енти -
фи катору класса наход и ти нформаци ю о местонахож д ени и сервера и з апускает
его. Серверспомощ ью ф аб ри ки классов (Class Factory) соз д аетэкземплярклас-
са – объект и в оз в ращ ает указ атель на з апрош енны й и нтерфей с (т.е. указ атель
на VTable), ув ели чи в ая на ед и ни цу счетчи кссы лок. Э тот указ атель перед ается
кли енту, которы й по смещ ени ю в VTable наход и тнуж ны й метод .
В се COM-объекты соз д аю тся фабри ками классов . К аж д ы й COM-класс и меет
соотв етств ую щ ую фабри ку, отв ечаю щ ую з а соз д ани е объектов этого класса.
Ф абри ка классов        – это COM-объект,             реали з ую щ и й и нтерфей с
IClassFactory. К лю чев ы м метод ом этого и нтерфей са яв ляется метод
CreateInstance, которы й и соз д ает экземпляр требуемого объекта. COM
в ы з ы в ает метод CreateInstance и перед ает полученны й и нтерфей с кли ен-
ту. И нтерфей с фабри ки классов соз д ается ав томати чески д ля в сех COM-
серв еров и при и х старте реги стри руется в си стеме. После з апуска и реги стра-
ци и COM сраз у получаетссы лку на фабри ку классов .

1.3. О бращ е ни е к и нт е рф е йсам