На этом шаге мы рассмотрим интерфейс IUnknown .
Интерфейс IUnknown, показанный на рисунке 1, должен присутствовать в любом СОМ-компоненте.
Рис.1. Интерфейс IUnknown
IUnknown содержит три метода, реализуемые Вами при создании CОM-объекта. В методе
QueryInterface() Вы обеспечиваете клиентской программе механизм доступа к любому из интерфейсов,
предоставляемых Вашим объектом.
Поскольку один экземпляр компонента может одновременно обслуживать запросы нескольких клиентов, Вы должны
создать в своем объекте счетчик использования. Этот закрытый элемент данных отслеживает число подключившихся
клиентских приложений. Его обслуживают методы AddRef() и Release(). При обнулении значения
счетчика компонент самоуничтожается.
При создании СОМ-компонентов методы IUnknown должны быть указаны первыми в таблице vtable.
Остальные методы, предоставляемые другими интерфейсами, перечисляются за ними.
На рисунке 2 показан примерный вид таблицы vtable объекта Encoder, приведенного на рисунке 1 предыдущего шага.
Рис.2. Примерная структура таблицы vtable
В vtable сначала перечислены методы IUnknown, за ними следуют методы, предоставляемые интерфейсом
IEncode, а в конце - ICommunicate. Создавая экземпляр объекта Encoder, библиотека
СОM получает указатель на начало vtable (на рисунке 2 - это pVtbl). Он может использоваться
для вызова QueryInterface() - первой функции в таблице, которая должна быть реализована так, чтобы она
возвращала указатель на запрашиваемый интерфейс.
На следующем шаге мы рассмотрим глобально уникальные идентификаторы.