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

UptoLike

6
function _AddRef: Integer; stdcall;
Эта функция должна увеличить счетчик ссылок на интерфейс на 1 и вернуть
новое значение счетчика .
function _Release: Integer; stdcall;
уменьшает счетчик ссылок на интерфейс на 1 и возвращает новое значение
счетчика . При достижении счетчиком значения 0 она должна освободить па -
мять , занятую объектом.
Первый метод позволяет получить ссылку на реализуемый классом интерфейс.
Функция
function QueryInterface(const IID: TGUID; out Obj):
HResult; stdcall;
получает в качестве входного параметра идентификатор интерфейса IID. Если
объект реализует запрошенный интерфейс, то функция
возвращает ссылку на него в параметре Obj
вызывает метод _AddRef полученного интерфейса
возвращает 0 (константу S_OK).
В противном случае функция возвращает код ошибки E_NOINTERFACE. В
модуле System.pas объявлен класс TInterfacedObject, реализующий IUn-
known и его методы. Рекомендуется использовать этот класс для создания реа -
лизаций своих интерфейсов .
Таким образом, IUnknown помогает решать задачи поиска нужного интер-
фейса , загрузки объекта с найденным интерфейсом в память и освобождения
памяти . Объект создается в памяти при первом обращении к любому интер-
фейсу , при этом на единицу увеличивается значение счетчика ссылок. При ра -
венстве счетчика нулю объект удаляется из памяти . Так как все интерфейсы на -
следуют IUnknown, то с помощью любого одного интерфейса можно получить
ссылку на все остальные интерфейсы .
Поясним теперь механизм вызова методов с помощью интерфейсов .
Адреса методов хранятся в так называемой виртуальной таблице VTable, созда-
ваемой в адресном пространстве COM-сервера для каждого интерфейса . Так
как порядок методов существенен (см . второе свойство интерфейсов ), первые
три строки каждой таблицы содержит ссылку на методы QueryInterface,
AddRef, Release, соответственно , последующие строки на собственные
методы интерфейса . При компиляции вместо имени метода в код клиента под -
ставляется не адрес, а порядковый номер метода в VTable. Получение ссылки
на интерфейс означает получение соответствующего адреса виртуальной таб-
лицы . Проблема доступа к интерфейсам (виртуальным таблицам) объекта , на-
ходящимся в чужом адресном пространстве, решается с помощью маршаллинга
(см . п. 2.6). Заметим, что внутренняя реализация механизма COM в различных
системах программирования может несколько отличаться.
Если интерфейс содержит описание свойства, то в виртуальной таблице хра -
нятся адреса методов чтения и записи свойства (см . примеры из раздела 2).
                                          6
function _AddRef: Integer; stdcall;
Э та функци я д олж на ув ели чи ть счетчи кссы локна и нтерфей с на 1 и в ернуть
нов оез начени есчетчи ка.
function _Release: Integer; stdcall;
уменьш ает счетчи к ссы лок на и нтерфей с на 1 и в оз в ращ ает нов ое з начени е
счетчи ка. При д ости ж ени и счетчи ком з начени я 0 она д олж на осв обод и ть па-
мять, з анятую объектом.
Первы й метод поз в оляетполучи ть ссы лку на реали з уемы й классом и нтерфей с.
Ф ункци я
function QueryInterface(const IID: TGUID; out Obj):
                                                        HResult; stdcall;
получает в качеств е в ход ного параметра и д енти фи катори нтерфей са IID. Е сли
объектреали з уетз апрош енны й и нтерфей с, то функци я
    • в оз в ращ аетссы лку на него в параметреObj
    • в ы з ы в аетметод _AddRef полученного и нтерфей са
    • в оз в ращ ает0 (константу S_OK).
В проти в ном случае функци я в оз в ращ ает код ош и бки E_NOINTERFACE. В
мод улеSystem.pas объяв лен классTInterfacedObject, реали з ую щ и й IUn-
known и его метод ы . Рекоменд уетсяи спольз ов ать этотклассд ля соз д ани яреа-
ли з аци й св ои х и нтерфей сов .
Т аки м образ ом, IUnknown помогает реш ать з ад ачи пои ска нуж ного и нтер-
фей са, з агруз ки объекта с най д енны м и нтерфей сом в память и осв обож д ени я
памяти . О бъект соз д ается в памяти при первом обращ ени и клю бому и нтер-
фей су, при этом на ед и ни цу ув ели чи в ается з начени е счетчи ка ссы лок. При ра-
в енств есчетчи ка нулю объектуд аляетсяи з памяти . Т аккакв сеи нтерфей сы на-
след ую тIUnknown, то спомощ ью лю бого од ного и нтерфей са мож но получи ть
ссы лку на в сеостальны еи нтерфей сы .
Поясни м теперь механи з м в ы з ов а метод ов спомощ ью и нтерфей сов .
А д реса метод ов хранятсяв такназ ы в аемой в и ртуальной табли цеVTable, соз д а-
в аемой в ад ресном пространств е COM-сервера д ля каж д ого и нтерфей са. Т ак
какпоряд окметод ов сущ еств енен (см. в торое св ой ств о и нтерфей сов ), первы е
три строки каж д ой табли цы сод ерж и т ссы лку на метод ы QueryInterface,
AddRef, Release, соотв етств енно, послед ую щ и е строки – на собств енны е
метод ы и нтерфей са. При компи ляци и в место и мени метод а в код кли ента под -
став ляется не ад рес, а поряд ков ы й номерметод а в VTable. Получени е ссы лки
на и нтерфей с оз начает получени е соотв етств ую щ его ад реса в и ртуальной таб-
ли цы . Проблема д оступа ки нтерфей сам (в и ртуальны м табли цам) объекта, на-
ход ящ и мсяв чуж ом ад ресном пространств е, реш аетсяспомощ ью марш алли нга
(см. п. 2.6). Замети м, что в нутренняя реали з аци ямехани з ма COM в раз ли чны х
си стемах программи ров ани ямож етнесколько отли чаться.
Е сли и нтерфей с сод ерж и т опи сани е св ой ств а, то в в и ртуальной табли це хра-
нятсяад реса метод ов чтени яи з апи си св ой ств а (см. при меры и з раз д ела 2).