Интерфейс
IUnknown
По аналогии с наследованием
классов, предком которых является базовый класс TObject
, все интерфейсы
являются прямыми или косвенными наследниками интерфейса IUnknown
.
Этот базовый интерфейс описан в модуле System
следующим образом
(листинг 10.3).
Листинг 10.3.Описание
базового интерфейса IUnknown
type
IUnknown = interface
function _Release: Integer; stdcall; end;
[ '{ 00000000-0000-0000-C000-000000000046} ' ]
function QueryInterface(const IID: TGUID; out Obj): Integer; stdcall;
function _AddRef: Integer; stdcall;
Синтаксис описания интерфейса
похож на описание класса. Главное отличие заключается в том, что интерфейс может
быть связан с глобальным уникальным идентификатором (Global Unique Identifier,
GUID).
GUID — это 128-разрядное
целое число, которое используется для уникальной идентификации интерфейсов.
Так как в 128-ми разрядах можно закодировать большое количество чисел, GUID
гарантирует глобальную уникальность идентификатора интерфейса. То есть, практически
невозможно, чтобы на двух компьютерах GUID совпал. Алгоритм генерации GUID основан
на аппаратной части компьютера (частота процессора, номер сетевой карты и т.
д.). В результате работы алгоритма, который может быть реализован с помощью
функции API CoCreateGUID
( ), получается запись типа TGUID.
Эту запись можно определить в виде строки следующего формата:
'{хххххххх-хххх-хххх-хххх-хххххххххххх}'
Для создания нового GUID
в среде Kylix достаточно нажать комбинацию клавиш <Ctrl>+<Shift>+<G>
при работе редактора кода.
Итак, интерфейс IUnknown
поддерживает три метода, которые наследуются всеми интерфейсами:
QueryInterface
(
) — используется для создания запроса, поддерживается ли данный интерфейс,
и если поддерживается, то метод возвращает указатель на него. Предположим,
что имеется некоторый объект Object
, который поддерживает несколько
интерфейсов: Interface1, Interface2
и др. Для получения указателя
на интерфейс Interface2
объекта Object
вам нужно
вызвать метод Interface2. QueryInterface( )
._AddRef ( )
— используется, когда получен указатель на данный интерфейс, и вы хотите использовать
этот указатель. Метод _AddRef ( )
обязательно должен заканчиваться
вызовом метода _Release ( )
._Release ( )
— используется для завершения работы с интерфейсом.