ВУЗ:
Составители:
Рубрика:
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).
Страницы
- « первая
- ‹ предыдущая
- …
- 4
- 5
- 6
- 7
- 8
- …
- следующая ›
- последняя »