Вход


Главная страница >> Учебный процесс >> Конспекты >> Delphi. Поддержка технологий COM >> Object Pascal и COM >> Интерфейс IUnknown

[Назад]    [Содержание ]    [Вперед]

  


Интерфейс IUnknown


Точно так же как все классы Object Pascal неявно наследуются от компонента TObject , все СОМ-интерфейсы (а следовательно, и все интерфейсы Object Pascal) неявно наследуются от IUnknown. Интерфейс IUnknown определяется в модуле System следующим образом:

type
Iunknown = interfase
═════[?{00000000-0000-0000-C000-000000000046}?]
═════function QueryInterfase(const IID:mTGUID;out Obj) Integer;stdcall;
═════function _AddRef: Integer;stdcall;
═════function _Release: Integer;stdcall;
end;

Как видно из приведенного фрагмента кода, при использовании ключевого слова interface существует еще одно явное различие между определениями интерфейса и класса? присутствие глобально-уникального идентификатора (Globally Unique Identifier ? GUID).

Глобально-уникальные идентификаторы (GUID)

GUID представляет собой 128-разрядное целое число, используемое для уникальной идентификации интерфейсов, компонентов классов и других объектов. GUID практически гарантирует настоящую глобальную уникальность, поскольку это довольно большое число и существует превосходный алгоритм для генерации этих чисел. GUID генерируется при помощи API-функции CoCreateGUID(), а алгоритм, используемый при генерации нового GUID, основан на комбинации из следующей информации: текущая дата и время, частота процессора, номер сетевой карты. Если на компьютере установлена сетевая карта, сгенерированный GUID на этом компьютере будет действительно уникальным, поскольку уникальность каждой сетевой карты гарантируется встроенным в нее глобальным идентификатором. Если же на компьютере нет сетевой карты, уникальность идентификатора определяется с помощью параметров другого установленного в компьютере оборудования.

Поскольку это не языковой тип, GUID соответствует записи TGUID, которая определяется в модуле System следующим образом:

PGUID = ^TGUID
TGUID = record
═════D1: LondWord;
═════D2: Word;
═════D3: Word;
═════D4: array[0..7] of Byte;
end;

Поскольку сложно установить значение GUID переменным и константам в этом формате записи, Object Pascal также позволяет определить TGUID как строку следующего формата:

?{xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx}?

Благодаря этому следующие объявления эквивалентны:

MyGuid: TGUID = (D1:$12345678;D2:$1234;D3:$1234;D4:($01,$02,$03,$04,$05,$06,$07,$08));
MyGuid: TGUID = ?{12345678-1234-1234-12345678}?;

В COM каждый интерфейс или класс имеет сопровождающий GUID, который является уникальным определителем интерфейса. В этом случае два интерфейса или класса, имеющих одинаковые имена и созданных двумя независимыми разработчиками

Совет Для генерации нового GUID в среде Delphi необходимо нажать комбинацию к <Ctrl+Shift+G> в окне Code Editor.

В дополнение к идентификаторам интерфейс IUnknown объявляет три метода: QueryInterface(), _AddRef() и _Release(). Поскольку IUnknown является основным интерфейсом COM, все интерфейсы должны содержать IUnknown и его методы. Метод _AddRef() может вызываться, если клиент получает и желает использовать указатель на нужный интерфейс. Вызов этого метода. должен сопровождаться вызовом метода _Release(), если клиент заканчивает работу с интерфейсом. В этом случае объект, содержащий интерфейс, может сохранять число клиентов, использующих указатель на объект, или вести подсчет ссылок (reference count). Когда число ссылок равно нулю, объект выгружается из памяти. Функция QueryInterfасе() используется для создания запроса, поддерживается ли необходимый интерфейс, и если поддерживается, то возвращается указатель на него. Предположим, что объект О поддерживает интерфейсы I1 и I2 .и уже существует указатель на интерфейс I1 объекта О. Для получения указателя на интерфейс I2 объекта О необходимо вызвать метод I2.QueryInterface().

На заметку Опытный СОМ-разработчик может заметить, что символ подчеркивания перед методами _AddRef() и _Release() не используется в других языках программирования или даже в документации Microsoft по СОМ. Поскольку Object Pascal ?знает? IUnknown, эти методы нельзя вызывать напрямую, так что символ подчеркивания существует главным образом для того, чтобы обратить внимание разработчика при вызове этих методов.

Поскольку каждый интерфейс в Delphi косвенно наследуется от IUnknown, каждый класс Delphi, реализующий интерфейсы, должен также поддерживать эти три метода интерфейса IUnknown.Эту "грязную работу" можно выполнить вручную, а можно поручить ее VCL ? например, класс наследующий TInterfacedObject, сразу же реализует интерфейс IUnknown.



[Назад]    [Содержание ]    [Вперед]

  


  
За содержание страницы отвечает Гончарова М.Н.
©
Кафедра СПиКБ, 2002-2017